java@Resource vs@Autowired
我应该在DI中使用哪个注释,@Resource(jsr250)或@Autowired(特定于Spring)
我在过去成功地使用了@Resource(name="blah")
和@Autowired @Qualifier("blah")
我的本能是坚持使用@Resource
标记,因为它已经得到了jsr人员的批准
有人对此有强烈的想法吗
你可以在下面搜索框中键入要查询的问题!
我应该在DI中使用哪个注释,@Resource(jsr250)或@Autowired(特定于Spring)
我在过去成功地使用了@Resource(name="blah")
和@Autowired @Qualifier("blah")
我的本能是坚持使用@Resource
标记,因为它已经得到了jsr人员的批准
有人对此有强烈的想法吗
# 1 楼答案
主要区别是,
@Autowired
是一个spring注释。而@Resource
是由JSR-250指定的,正如您自己指出的。因此,后者是Java的一部分,而前者是特定于Spring的因此,从某种意义上说,你的建议是正确的。我发现人们使用
@Autowired
和@Qualifier
是因为它更强大。从某个框架转移到另一个框架被认为是非常不可能的,如果不是神话的话,尤其是在Spring的情况下# 2 楼答案
我想强调@Jules关于this answer对这个问题的一点评论。该评论带来了一个有用的链接:Spring Injection with @Resource, @Autowired and @Inject。我鼓励您完整阅读,但以下是对其有用性的快速总结:
注释如何选择正确的实现
@Autowired
和@Inject
@Resource
我应该使用哪种注释(或它们的组合)来注入bean
显式命名组件[@component(“beanName”)]
使用
@Resource
和name
属性[@Resource(name=“beanName”)]为什么我不应该使用
@Qualifier
避免
@Qualifier
注释,除非您想创建类似bean的列表。例如,您可能希望使用特定的@Qualifier
注释标记一组规则。这种方法使得将一组规则类注入到可用于处理数据的列表中变得简单bean注入会减慢我的程序吗
扫描特定包中的组件
[context:component-scan base-package="com.sourceallies.person"]
。虽然这将导致更多的component-scan
配置,但它减少了向Spring上下文添加不必要组件的可能性参考资料:Spring Injection with @Resource, @Autowired and @Inject
# 3 楼答案
这是我从Spring 3.0.x Reference Manual得到的:
# 4 楼答案
@Autowired+@限定符仅适用于spring DI,如果您希望在将来使用其他DI,@Resource是一个不错的选择
我发现另一个非常重要的区别是@Qualifier不支持动态bean连接,因为@Qualifier不支持占位符,而@Resource做得很好
例如: 如果您有一个与多个实现类似的接口
带@Autowired&@您需要设置特定子实现的限定符 像
它不提供占位符,而使用@Resource时,您可以放置占位符并使用属性文件注入特定的子实现,如
哪里有服务。名称在属性文件中设置为
希望对某人有所帮助:)
# 5 楼答案
无论是{}(或{})还是{}都同样有效。但这是一个概念上的差异或意义上的差异
@Resource
表示按名称给我一个已知资源。名称从带注释的setter或字段的名称中提取,或从name参数中提取李>@Inject
或@Autowired
尝试按类型连接合适的其他组件李>所以,基本上这是两个截然不同的概念。不幸的是
@Resource
的Spring实现有一个内置的回退机制,当按名称解析失败时,该机制就会启动。在本例中,它返回到按类型的@Autowired
类解析。虽然这种回退很方便,但它会引起很多混乱,因为人们不知道概念上的差异,倾向于使用@Resource
进行基于类型的自动连接# 6 楼答案
在3.0之前的春季,选择哪一个并不重要
在Spring3.0中,支持标准(JSR-330)注释
@javax.inject.Inject
——使用它,并结合使用@Qualifier
。请注意,spring现在还支持@javax.inject.Qualifier
元注释:所以你可以
或
然后:
这减少了字符串名称的使用,因为字符串名称可能拼写错误,并且更难维护
至于原始问题:两者都不指定注释的任何属性,而是按类型执行注入。区别在于:
@Resource
允许您指定注入bean的名称@Autowired
允许您将其标记为非强制性李>