【发布时间】:2012-02-24 18:12:09
【问题描述】:
我看不出两种方式有什么区别,@Qualifier 总是与 @Autowired 一起使用。
@Autowired
@Qualifier("alpha")
VS
@Resource(name="alpha")
谁能告诉我区别?谢谢!
【问题讨论】:
我看不出两种方式有什么区别,@Qualifier 总是与 @Autowired 一起使用。
@Autowired
@Qualifier("alpha")
VS
@Resource(name="alpha")
谁能告诉我区别?谢谢!
【问题讨论】:
@Autowired 是老派的 Spring。 @Resource 是 Java EE CDI 标准。 Spring 处理这两种情况(以及非常相似的@Inject)并且在两种情况下都做几乎相同的事情。我会推荐@Resource,@Autowired 是在标准之前制作的,似乎主要是为了向后兼容而受到支持。
【讨论】:
@Autowired可以单独使用。如果单独使用,则按类型接线。因此,如果在容器中声明了多个相同类型的 bean,则会出现问题,因为 @Autowired 不知道要使用哪个 bean 来注入。因此,使用@Qualifier和@Autowired通过指定bean名称(按名称连接)来明确要实际连接哪些bean
@Resource 也是按名称连接的。所以如果@Autowired 与@Qualifier 一起使用,则与@Resource 相同。
区别在于@Autowired 和@Qualifier 是spring 注释,而@Resource 是标准java 注释(来自JSR-250)。此外,@Resource 仅支持字段和 setter 注入,而@Autowired 支持字段、setter、构造函数和多参数方法注入。
字段和setter注入建议使用@Resource。对于构造函数或多参数方法注入,请坚持使用 @Qualifier 和 @Autowired。
见this:
如果你打算用名字来表达注解驱动的注入,不要 主要使用@Autowired - 即使在技术上能够引用 通过 @Qualifier 值到 bean 名称。相反,更喜欢 JSR-250 @Resource 注解,它在语义上定义为标识一个 具有唯一名称的特定目标组件,具有声明的类型 与匹配过程无关。
【讨论】:
我在使用@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 名称相同的变量名,但不小心使用了其他变量名并遇到了这个问题。
如果有任何疑问,请告诉我。
【讨论】: