哪个注释,@Resource (jsr250)或@Autowired (spring特定)我应该在DI中使用?
我已经成功地使用在过去,@资源(名称="blah")和@Autowired @Qualifier("blah")
我的直觉是坚持使用@Resource标签,因为它已经被jsr的人批准了。 有人对此有强烈的想法吗?
哪个注释,@Resource (jsr250)或@Autowired (spring特定)我应该在DI中使用?
我已经成功地使用在过去,@资源(名称="blah")和@Autowired @Qualifier("blah")
我的直觉是坚持使用@Resource标签,因为它已经被jsr的人批准了。 有人对此有强烈的想法吗?
当前回答
当您从这两个注释的基类进行严格分析时。您将认识到以下不同之处。
@Autowired使用AutowiredAnnotationBeanPostProcessor注入依赖项。 @Resource使用CommonAnnotationBeanPostProcessor注入依赖项。
尽管它们使用不同的后置处理器类,但它们的行为几乎相同。 关键的区别在于它们的执行路径,我在下面强调了这一点。
@Autowired / @Inject
1.按类型匹配 2.限定词限制 3.名称匹配
@Resource
1.名称匹配 2.按类型匹配 3.通过限定符进行限制(如果通过名称找到匹配则忽略)
其他回答
@Autowired(或@Inject)和@Resource都能很好地工作。但在概念上或意义上存在差异
@Resource意思是让我知道一个已知的资源的名称。名称从带注释的setter或字段的名称中提取,或者从name- parameter中提取。 @Inject或@Autowired尝试按类型插入合适的其他组件。
基本上这是两个截然不同的概念。不幸的是,@Resource的spring实现有一个内置的回退,当名称解析失败时就会启动。在本例中,它返回到按类型的@Autowired-kind解析。虽然这种回退很方便,但恕我说,它会引起很多混乱,因为人们没有意识到概念上的差异,并且倾向于使用@Resource进行基于类型的自动装配。
主要的区别是,@Autowired是一个spring注释。而@Resource是由JSR-250指定的,正如您自己指出的那样。因此,后者是Java的一部分,而前者是Spring特有的。
因此,在某种意义上,你的建议是正确的。我发现人们使用@Autowired和@Qualifier,因为它更强大。从一个框架转移到另一个框架被认为是不太可能的,特别是在Spring的情况下。
@Autowired + @Qualifier将只与spring DI一起工作,如果你想在未来使用一些其他DI @Resource是一个不错的选择。
另一个我发现非常重要的区别是@Qualifier不支持动态bean连接,因为@Qualifier不支持占位符,而@Resource做得很好。
例如: 如果你有一个像这样有多个实现的接口
interface parent {
}
@Service("actualService")
class ActualService implements parent{
}
@Service("stubbedService")
class SubbedService implements parent{
}
使用@Autowired和@Qualifier,你需要设置特定的子实现 就像
@Autowired
@Qualifier("actualService") or
@Qualifier("stubbedService")
Parent object;
它不提供占位符,而@资源,你可以把占位符和使用属性文件注入特定的子实现,如
@Resource(name="${service.name}")
Parent object;
service.name在属性文件中设置为
#service.name=actualService
service.name=stubbedService
希望这能帮助到一些人:)
我想强调一下@Jules对这个问题的回答。注释带来了一个有用的链接:带有@Resource、@Autowired和@Inject的Spring注入。我鼓励你把它通读一遍,但这里有一个简单的总结:
注释如何选择正确的实现?
@Autowired和@Inject
按类型匹配 限定词限制 名称匹配
@
名称匹配 按类型匹配 通过限定符进行限制(如果通过名称找到匹配则忽略)
我应该使用哪些注释(或组合)来注入bean ?
明确地为组件命名[@Component(" bename ")] 使用带有name属性的@Resource [@Resource(name="beanName")]
为什么我不应该使用@Qualifier?
避免使用@Qualifier注释,除非您想创建一个类似bean的列表。例如,您可能希望用特定的@Qualifier注释标记一组规则。这种方法使将一组规则类注入可用于处理数据的列表变得简单。
bean注入会减慢我的程序吗?
扫描特定包中的组件[context:component-scan base-package="com.sourceallies.person"]。虽然这将导致更多的组件扫描配置,但它减少了向Spring上下文添加不必要组件的机会。
参考:使用@Resource, @Autowired和@Inject进行Spring注入
这里有一个注释: SpringBeanAutowiringSupport。processInjectionBasedOnCurrentContext和SpringBeanAutowiringSupport。processInjectionBasedOnServletContext不能使用@Resource注释。所以,这是有区别的。