@Resource vs @Autowired

问题

我应该在DI中使用哪个注释,@Resource(jsr250)或**@Autowired**(特定于Spring)?

我已成功使用过去的两个,@Resource(name="blah")@Autowired @Qualifier("blah")

我的直觉是坚持使用@Resourcetag,因为它已被jsr人批准。
有人对此有强烈的想法吗?


#1 热门回答(399 赞)

@Autowired(或@Inject)和@Resource都同样出色。但是意义上存在概念差异或差异

  • @Resource意味着按名称给我一个已知的资源。该名称是从带注释的setter或字段的名称中提取的,或者是从name-Parameter中获取的。
  • @Inject或@Autowired尝试按类型连接合适的其他组件。

所以,基本上这些是两个截然不同的概念。不幸的是,@Resource的Spring-Implementation具有内置的回退功能,当解析按名称失败时,它会启动。在这种情况下,它按类型回退到@Autowired类决议。虽然这种后备很方便,恕我直言会引起很多混乱,因为人们不知道概念上的差异,并倾向于使用@Resource进行基于类型的自动装配。


#2 热门回答(153 赞)

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

在3.0版本中,支持标准(JSR-330)annotation@javax.inject.Inject-使用它,结合使用@Qualifier。请注意,spring现在也支持@javax.inject.Qualifiermeta-annotation:

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

所以你可以拥有

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

要么

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

接着:

@Inject @YourQualifier private Foo foo;

这减少了字符串名称的使用,这可能会拼写错误并且难以维护。

至于原始问题:两者都没有指定注释的任何属性,而是按类型执行注入。不同之处是:

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

#3 热门回答(68 赞)

主要区别在于,@Autowired是一个弹簧注释。正如你自己指出的那样,JSAS-250指定了5777138246。所以后者是Java的一部分,而前者是Spring特有的。

因此,从某种意义上说,你是正确的。我发现人们使用了4@Autowired@Qualifier,因为它更强大。如果不是神话,那么从一些框架转移到其他框架被认为是不太可能的,特别是在Spring的情况下。