【问题标题】:Difference between @Qualifier and @Resource@Qualifier 和 @Resource 之间的区别
【发布时间】:2012-02-24 18:12:09
【问题描述】:

我看不出两种方式有什么区别,@Qualifier 总是与 @Autowired 一起使用。

@Autowired
@Qualifier("alpha")

VS

@Resource(name="alpha")

谁能告诉我区别?谢谢!

【问题讨论】:

标签: java spring


【解决方案1】:

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

【讨论】:

  • 所以你的意思是@Resource 是当前的春季标准。我们应该在 Spring bean 中使用 @Resource 而不是 @Autowired
【解决方案2】:

@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 注解,它在语义上定义为标识一个 具有唯一名称的特定目标组件,具有声明的类型 与匹配过程无关。

【讨论】:

  • 它实际上是在哪里说的?我看到它说如果您想按名称自动装配就使用它,我看不出在哪里建议首选资源(在某些情况下它实际上不起作用)。
  • 更新了。在3.11.3的Tips部分有说
【解决方案3】:

我在使用@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 名称相同的变量名,但不小心使用了其他变量名并遇到了这个问题。

如果有任何疑问,请告诉我。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2018-07-04
    • 2019-05-26
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    相关资源
    最近更新 更多