Java @自动连线查找不明确的依赖项,并且仍然有效。怎样
为什么Spring没有抛出Java @自动连线查找不明确的依赖项,并且仍然有效。怎样,java,spring,annotations,spring-annotations,Java,Spring,Annotations,Spring Annotations,为什么Spring没有抛出NoSuchBeanDefinitionException,其中存在不明确的依赖项,并且使用@Autowired注释找到了多个用于自动连接的bean候选项 我有一个简单的beans.xml,它有两个相同的bean,它们具有不同的idcategory和category1,并且出于某种原因 选择类别bean进行自动关联。我的印象是,@Autowired注释在内部使用byType自动连接 由于这里有多个匹配项,Spring将抛出NoSuchBeanDefinitionExce
NoSuchBeanDefinitionException
,其中存在不明确的依赖项,并且使用@Autowired
注释找到了多个用于自动连接的bean候选项
我有一个简单的beans.xml,它有两个相同的bean,它们具有不同的idcategory
和category1
,并且出于某种原因
选择类别
bean进行自动关联。我的印象是,@Autowired
注释在内部使用byType
自动连接
由于这里有多个匹配项,Spring将抛出NoSuchBeanDefinitionException
exception
我使用的是spring版本3.2.13。请在此处发布
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans
..... ">
<context:annotation-config />
<bean id="product" class="com.study.spring.Product">
<property name="id" value="101"/>
<property name="name" value="Apple iPhone"/>
<property name="active" value="true"/>
</bean>
<bean id="category1" class="com.study.spring.Category">
<property name="id" value="202"/>
<property name="name" value="Phone"/>
<property name="active" value="true"/>
</bean>
<bean id="category" class="com.study.spring.Category">
<property name="id" value="201"/>
<property name="name" value="Communications"/>
<property name="active" value="true"/>
</bean>
</beans>
它接受id为Category
的Category
对象,因为它与字段的名称匹配。旧的解释是:
对于回退匹配,bean名称被视为默认限定符值
政府对此的解释更清楚一些。这里有一个“按名称”自动布线的情况:
按属性名称自动关联。Spring查找与需要自动连接的属性同名的bean。例如,如果一个bean定义按名称设置为autowire,并且它包含一个master属性(即,它有一个setMaster(..)方法),Spring将查找一个名为master的bean定义,并使用它来设置属性
它接受id为Category
的Category
对象,因为它与字段的名称匹配。旧的解释是:
对于回退匹配,bean名称被视为默认限定符值
政府对此的解释更清楚一些。这里有一个“按名称”自动布线的情况:
按属性名称自动关联。Spring查找与需要自动连接的属性同名的bean。例如,如果一个bean定义按名称设置为autowire,并且它包含一个master属性(即,它有一个setMaster(..)方法),Spring将查找一个名为master的bean定义,并使用它来设置属性
我在读《行动中的春天》第三版,这是一本让我困惑的书的摘录。限定模棱两可的依赖关系——另一方面,问题可能不是缺少可供Spring autowiring选择的bean,而是有大量(或至少两个)bean,每个bean都同样有资格连接到属性中。例如,假设您有两个bean实现该工具。在这种情况下,@Autowired无法选择您真正想要的。因此,与猜测相反,将抛出NoSuchBeanDefinitionException,并且连线将失败。现在更清楚了吗?您是否尝试将字段重命名为除类别
以外的其他名称,然后查看发生了什么?是的,我理解。我将category
重命名为category1
,导致异常NoSuchBeanDefinitionException
。因此,在出现歧义的情况下,Spring有一个回退机制来解决bean歧义byName
autowiring特性,否则byType
是默认的。我正在阅读Spring in Action-3rd Edition,这是一本让我困惑的书的摘录。限定模棱两可的依赖关系——另一方面,问题可能不是缺少可供Spring autowiring选择的bean,而是有大量(或至少两个)bean,每个bean都同样有资格连接到属性中。例如,假设您有两个bean实现该工具。在这种情况下,@Autowired无法选择您真正想要的。因此,与猜测相反,将抛出NoSuchBeanDefinitionException,并且连线将失败。现在更清楚了吗?您是否尝试将字段重命名为除类别
以外的其他名称,然后查看发生了什么?是的,我理解。我将category
重命名为category1
,导致异常NoSuchBeanDefinitionException
。因此,在出现歧义的情况下,Spring有一个回退机制来解决bean歧义byName
autowiring特性,否则默认为byType
。
package com.study.spring;
import org.springframework.beans.factory.annotation.Autowired;
public class Product {
private int id;
private String name;
private boolean active;
@Autowired
private Category category;
//getters and setters here
}