我正在开发基本的@Autowired程序,其中有2个类Alpha
和Beta
。这里Alpha
使用Beta
对@Autowired
有依赖性。
在spring配置文件中,我为Beta
类创建了1个以上的bean,因此当它尝试将依赖项注入Alpha类时,我期待Spring产生异常,因为有2个Beta bean而不是1个。但是在我的程序中没有任何例外,它工作正常。
这是我的代码:
Alpha.java
public class Alpha {
@Autowired
private Beta beta;
public Alpha() {
System.out.println("Inside Alpha constructor.");
}
@Override
public String toString() {
return "Alpha [beta=" + beta + "]";
}
}
Beta.java
public class Beta {
public Beta() {
System.out.println("Inside Beta constructor.");
}
@Override
public String toString() {
return "This is Beta";
}
}
spring-config.xml
<beans>
<context:annotation-config/>
<bean id="alpha" class="Alpha">
</bean>
<bean id="beta" class="Beta">
</bean>
<bean id="beta1" class="Beta">
</bean>
<bean id="beta2" class="Beta">
</bean>
</beans>
主程序:
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
Alpha alpha = (Alpha) context.getBean("alpha");
System.out.println(alpha);
}
这是输出:
Inside Alpha constructor.
Inside Beta constructor.
Inside Beta constructor.
Inside Beta constructor.
Alpha [beta=This is Beta]
最佳答案
它按名称自动接线。您有三种类型为Beta1
的bean,分别称为beta
,beta1
和beta2
。您的字段名为beta
。 Spring将以此为提示来查找相应的bean。
如果您命名自己的领域
@Autowired
private Beta whatever;
Spring不会有任何(有用的)提示,并且它将无法选择合适的bean。
在Spring文档中并不是很明显,您必须从各个章节中进行推断。
从chapter concerning
@Autowired
中的注释如果要按名称表示注释驱动的注入,请不要
主要使用
@Autowired
,即使在技术上能够引用通过
@Qualifier
值转换为bean名称。而是使用JSR-250@Resource
注释,在语义上定义为标识一个具有唯一名称的特定目标组件,具有声明的类型
与匹配过程无关。
对于
@Qualifier
值(或者缺少@Qualifier
)对于后备匹配,bean名称被认为是默认的限定符值
然后从chapter on
@Resource
如果未在[
@Resource
批注]中明确指定名称,则默认名称源自字段名称或设置方法。 如果是字段,则需要
字段名;在使用setter方法的情况下,它具有bean属性
名称。