我应该在DI中使用哪一个注释@Resource ( jsr250 )或@Autowired (特定于Spring)? spring
我过去已成功使用@Resource(name="blah")
和@Autowired @Qualifier("blah")
函数
个人直觉是坚持使用@Resource
标记,由于它已被jsr人士批准。
有人对此有强烈的想法吗? spa
@Autowired
(或@Inject
)和@Resource
能够很好地工做。 可是在概念上或意义上存在差别 .net
@Resource
意思是让我知道一个已知的资源 。 该名称是从带注释的设置器或字段的名称中提取的,或者是从名称-Parameter中获取的。 @Inject
或@Autowired
尝试按类型链接合适的其余组件 。 所以,基本上,这是两个大相径庭的概念。 不幸的是, @Resource
的Spring-Implementation具备内置的后备功能,当解析按名称失败时会启用该功能。 在这种状况下,它会按类型退回到@Autowired
-kind分辨率。 虽然这种后备方式很方便,可是恕我直言,它引发了不少混乱,由于人们没有意识到概念上的差别,而且倾向于使用@Resource
进行基于类型的自动装配。 code
做为一个说明这里: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext
和SpringBeanAutowiringSupport.processInjectionBasedOnServletContext
与不工做@Resource
注解。 所以,有区别。 component
这是我从Spring 3.0.x参考手册中得到的 : 对象
小费 blog
若是您打算经过名称表示注释驱动的注入,则即便技术上能够经过@Qualifier值引用bean名称,也不要主要使用@Autowired。 而是使用JSR-250 @Resource批注,该批注的语义定义是经过其惟一名称标识特定的目标组件,而声明的类型与匹配过程无关。 资源
因为这种语义差别的特定结果,自己定义为集合或映射类型的bean没法经过@Autowired注入,由于类型匹配不适用于它们。 对此类bean使用@Resource,经过惟一名称引用特定的collection或map bean。 get
@Autowired适用于字段,构造函数和多参数方法,从而容许在参数级别缩小限定符注释的范围。 相比之下,只有具备单个参数的字段和bean属性设置器方法才支持@Resource。 所以,若是注入目标是构造函数或多参数方法,请坚持使用限定符。
@Resource
一般由经过JNDI定义的高级对象使用。 @Autowired
或@Inject
将被更多的普通bean使用。
据我所知,它不是规范,也不是约定。 这是标准代码使用这些批注的逻辑方式。
我想强调@Jules对这个问题的回答 。 该注释带来了一个有用的连接: 带有@ Resource,@ Autowired和@Inject的Spring Injection 。 我鼓励您完整阅读它,可是这里简要概述了它的有用性:
@Autowired
和@Inject
@Resource
明确命名您的组件[@Component(“ beanName”)]
将@Resource
与name
属性[@Resource(name =“ beanName”)]一块儿使用
@Qualifier
? 除非要建立相似bean的列表,不然避免使用@Qualifier
批注。 例如,您可能想用特定的@Qualifier
批注标记一组规则。 这种方法使将一组规则类注入到可用于处理数据的列表中变得很简单。
扫描组件的特定程序包[context:component-scan base-package="com.sourceallies.person"]
。 虽然这将致使更多的component-scan
配置,但它减小了将没必要要的组件添加到Spring上下文的机会。