问题
我应该在DI中使用哪个注释,@Resource(jsr250)或**@Autowired**(特定于Spring)?
我已成功使用过去的两个,@Resource(name="blah")
和@Autowired @Qualifier("blah")
我的直觉是坚持使用@Resource
tag,因为它已被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.Qualifier
meta-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的情况下。