我正在开发基本的@Autowired程序,我有2个班Alpha
和Beta
。此处Alpha
使用Beta
依赖于@Autowired
。
在Spring配置文件中,我为类Beta
类型创建了多个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";
}
}
弹簧-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]
答案 0 :(得分:7)
按名称自动装配。您有三个Beta1
类型的bean,名为beta
,beta1
和beta2
。您的字段名为beta
。 Spring将使用它作为提示来查找相应的bean。
如果您将字段命名为
@Autowired
private Beta whatever;
对Spring没有(有用的)提示,它将无法选择合适的bean。
在Spring文档中并不完全明显,你必须从各个章节中推断它。
来自chapter concerning @Autowired
如果您打算按名称表达注释驱动的注入,请不要 主要使用
@Autowired
,即使技术上能够引用 通过@Qualifier
值到bean名称。相反,使用JSR-250@Resource
注释,在语义上定义以标识a 特定目标组件的唯一名称,具有声明的类型 与匹配过程无关。
对于@Qualifier
值(或者更确切地说是缺少@Qualifier
)
对于后备匹配,bean名称被视为默认限定符值
如果[{1}}注释]中没有明确指定名称,则默认名称来自 字段名称或setter方法。 如果是某个字段,则需要 字段名称;在setter方法的情况下,它采用bean属性 名。
答案 1 :(得分:0)
Here是使用@Autowired
,@Inject
和@Resource
注释的Spring bean解析机制的非常好的摘要。
由于注入的bean的默认名称是字段的名称,因此注入了bean beta
。
答案 2 :(得分:0)
@Autowired Beta beta正在寻找名为&#34; beta&#34;的bean。那就是春豆工厂。因此不存在这样的问题