首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Resource @Autowired

@Resource @Autowired
EN

Stack Overflow用户
提问于 2010-11-04 02:50:58
回答 11查看 277.1K关注 0票数 431

我应该在DI中使用哪个注释,即@Resource (jsr250)还是@Autowired (Spring特定的)?

我过去曾成功地使用过@Resource(name="blah")@Autowired @Qualifier("blah")

我的直觉是坚持使用@Resource标签,因为它已经得到了jsr的批准。

有人对此有强烈的想法吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-11-04 09:21:16

在春季的3.0前,哪一个并不重要。

在Spring3.0中,对标准(JSR-330)注释@javax.inject.Inject的支持--使用它,并结合使用@Qualifier。请注意,spring现在也支持@javax.inject.Qualifier元注释:

代码语言:javascript
复制
@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

所以你可以

代码语言:javascript
复制
<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

代码语言:javascript
复制
@YourQualifier
@Component
public class SomeBean implements Foo { .. }

然后:

代码语言:javascript
复制
@Inject @YourQualifier private Foo foo;

这就减少了字符串名的使用,因为字符串名可能拼写错误,而且很难维护。

至于最初的问题:两者都没有指定注释的任何属性,而是按类型执行注入。区别是:

  • @Resource允许您指定注入bean的名称。
  • @Autowired允许您将其标记为非强制性的。
票数 212
EN

Stack Overflow用户

发布于 2012-06-06 14:54:38

@Autowired (或@Inject)和@Resource都工作得同样好。但是在概念上有区别或者在意义上有区别。

  • @Resource的意思是给我一个名为的已知资源。该名称是从带注释的setter或字段的名称中提取的,或者从名称参数中提取。
  • @Inject@Autowired试图按类型在中连接合适的其他组件。

基本上,这是两个截然不同的概念。不幸的是,@Resource的Spring实现有一个内置的退路,当按名解析失败时,它就会起作用。在本例中,它按类型返回到@Autowired-kind解析。虽然这种退步很方便,但IMHO会造成许多混乱,因为人们不知道概念上的差异,而且倾向于使用@Resource进行基于类型的自动装配。

票数 569
EN

Stack Overflow用户

发布于 2010-11-04 03:39:51

主要的区别是,@Autowired是一个spring注释。然而,正如您自己指出的,@Resource是由JSR-250指定的。因此,后者是Java的一部分,而前者是Spring特定的。

因此,从某种意义上说,你的建议是正确的。我发现人们在使用@Autowired时使用@Qualifier,因为它更强大。从某个框架转移到另一个框架被认为是非常不可能的,如果不是神话的话,尤其是在Spring的情况下。

票数 84
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4093504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档