@Qualifier和@Resource之间的区别

时间:2012-02-02 02:35:48

标签: java spring

我认为两种方式之间没有任何区别, @Qualifier 总是与 @Autowired 一起使用。

@Autowired
@Qualifier("alpha")

VS

@Resource(name="alpha")

任何人都可以告诉我这个区别吗?谢谢!

3 个答案:

答案 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是在标准之前制作的,似乎主要是为了向后兼容性而受到支持。