我认为两种方式之间没有任何区别, @Qualifier 总是与 @Autowired 一起使用。
@Autowired
@Qualifier("alpha")
VS
@Resource(name="alpha")
任何人都可以告诉我这个区别吗?谢谢!
答案 0 :(得分:58)
@Autowired
可以单独使用。如果单独使用,它将按类型连接。因此,如果在容器中声明了多个相同类型的bean,则会出现问题,因为@Autowired
不知道要使用哪个bean来注入。因此,使用@Qualifier
和@Autowired
一起通过指定bean名称(按名称连接)来阐明实际连接的bean
@Resource
也按名称连线。因此,如果@Autowired
与@Qualifier
一起使用,则与@Resource
相同。
区别在于@Autowired
和@Qualifier
是spring注释,而@Resource
是标准java注释(来自JSR-250)。此外,@Resource
仅支持字段和setter注入,而@Autowired
支持字段,setter,构造函数和多参数方法注入。
建议将@Resource
用于字段和setter注入。坚持@Qualifier
和@Autowired
用于构造函数或多参数方法注入。
请参阅this:
如果您打算按名称表达注释驱动的注入,请不要 主要使用@Autowired - 即使技术上能够引用 通过@Qualifier值获取bean名称。相反,更喜欢JSR-250 @Resource注释,在语义上定义为标识a 特定目标组件的唯一名称,具有声明的类型 与匹配过程无关。
答案 1 :(得分:5)
我遇到了@Autowired的一些问题,然后开始使用@Qualifier,当我定义了多个相同类型的bean时,我终于能够找到何时使用@Autowired和@Qualifier。
假设您定义了2个相同类型但值不同的bean:
<bean id="appContext1" class="com.context.AppContext">
<constructor-arg value="abc" />
<bean/>
<bean id="appContext2" class="com.context.AppContext">
<constructor-arg value="ABC" />
<bean/>
然后,如果您只是尝试使用@Autowire,那么您必须使用与bean名称相同的变量名称,否则它将在找到多个类型时给出错误。
@Autowired
AppContext appContext;
对于上述用例,您必须使用限定符。
@Autowired
@Qualifier("appContext1")
AppContext appContext;
相反,如果使用与bean名称相同的变量名称,则可以取消使用@Qualifier。
@Autowired
AppContext appContext1;
我总是使用与bean名称相同的变量名称,但是偶然有一些其他变量名称并且遇到了这个问题。
如果有任何疑问,请告诉我。
答案 2 :(得分:3)
@Autowired是老派春天。 @Resource是Java EE CDI标准。 Spring处理两者(以及@Inject,它非常相似)并且在两种情况下都做同样的事情。我建议@Resource,@ Autowired是在标准之前制作的,似乎主要是为了向后兼容性而受到支持。