2012-02-02 103 views
26

我没有看到两种方式之间的区别,@Qualifier总是与@Autowired一起使用。@Qualifier和@Resource之间的区别

@Autowired 
@Qualifier("alpha") 

VS

@Resource(name="alpha") 

任何人都可以让我知道有什么区别?谢谢!

+0

[@Resource vs @Autowired]可能的重复(http://stackoverflow.com/questions/4093504/resource-vs-autowired) – skaffman 2012-02-02 09:24:06

回答

49

@Autowired可以单独使用。如果单独使用,它将按类型连线。因此,如果在容器中声明了多个相同类型的Bean,则@Autowired不知道要使用哪个bean注入的问题。因此,请使用@Qualifier@Autowired一起说明通过指定bean名称(通过名称连接)实际连接的bean。

@Resource也通过名称连接。因此,如果@Autowired@Qualifier一起使用,则与@Resource相同。

区别在于@Autowired@Qualifier是弹簧注释,而@Resource是标准java注释(来自JSR-250)。另外,@Resource只支持字段和setter注入,而@Autowired支持字段,setter,构造函数和多参数方法注入。

建议使用@Resource进行字段和setter注入。坚持使用@Qualifier@Autowired作构造函数或多参数方法注入。

this

如果要表达的名字注解驱动的注入,不 主要使用@Autowired - 即使是在技术上能够通过@Qualifier值指 一个bean的名字。相反,更喜欢JSR-250 @资源注释,它的语义定义是通过其唯一的名称来标识特定的目标组件,其中声明的类型 与匹配过程无关。

+0

它在哪里说的?如果你想通过名字自动装载,我发现它说要使用它,我不知道它在哪里建议使用资源(在某些情况下它实际上不会工作)。 – 2012-02-02 03:04:42

+0

更新。它在3.11.3的提示部分中说过 – 2012-02-02 03:11:41

3

@Autowired是老派的春天。 @Resource是Java EE CDI标准。 Spring处理这两个(以及@Inject,这非常相似),并且在两种情况下都做了几乎相同的事情。我会推荐@Resource,@Autowired是在标准之前制定的,并且似乎主要是为了向后兼容性而提供支持。

+0

所以你的意思是@Resource是当前的春季标准。我们应该在我们的Spring beans中使用@Resource而不是@ Autowired – 2017-07-18 06:49:39

4

我面临着@Autowired一些问题,然后使用@Qualifier开始,我终于能够找出定义相同类型的多个Bean时用于@Autowired @Qualifier用。

假设你定义2种豆同一类型但不同的价值观:

<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的名字,却意外地有一些其他的变量名和面临这个问题。

让我知道是否有任何疑问。

相关问题