@Resource vs @Autowired

我应该在DI中使用哪一个注释@Resourcejsr250 )或@Autowired (特定于Spring)? spring

我过去已成功使用@Resource(name="blah")@Autowired @Qualifier("blah") 函数

个人直觉是坚持使用@Resource标记,由于它已被jsr人士批准。
有人对此有强烈的想法吗? spa


#1楼

@Autowired (或@Inject )和@Resource能够很好地工做。 可是在概念上或意义上存在差别 .net

  • @Resource意思是让我知道一个已知的资源 。 该名称是从带注释的设置器或字段的名称中提取的,或者是从名称-Parameter中获取的。
  • @Inject@Autowired尝试按类型链接合适的其余组件

所以,基本上,这是两个大相径庭的概念。 不幸的是, @Resource的Spring-Implementation具备内置的后备功能,当解析按名称失败时会启用该功能。 在这种状况下,它会按类型退回到@Autowired -kind分辨率。 虽然这种后备方式很方便,可是恕我直言,它引发了不少混乱,由于人们没有意识到概念上的差别,而且倾向于使用@Resource进行基于类型的自动装配。 code


#2楼

做为一个说明这里: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContextSpringBeanAutowiringSupport.processInjectionBasedOnServletContext工做@Resource注解。 所以,有区别。 component


#3楼

这是我从Spring 3.0.x参考手册中得到的对象

小费 blog

若是您打算经过名称表示注释驱动的注入,则即便技术上能够经过@Qualifier值引用bean名称,也不要主要使用@Autowired。 而是使用JSR-250 @Resource批注,该批注的语义定义是经过其惟一名称标识特定的目标组件,而声明的类型与匹配过程无关。 资源

因为这种语义差别的特定结果,自己定义为集合或映射类型的bean没法经过@Autowired注入,由于类型匹配不适用于它们。 对此类bean使用@Resource,经过惟一名称引用特定的collection或map bean。 get

@Autowired适用于字段,构造函数和多参数方法,从而容许在参数级别缩小限定符注释的范围。 相比之下,只有具备单个参数的字段和bean属性设置器方法才支持@Resource。 所以,若是注入目标是构造函数或多参数方法,请坚持使用限定符。


#4楼

@Resource一般由经过JNDI定义的高级对象使用。 @Autowired@Inject将被更多的普通bean使用。

据我所知,它不是规范,也不是约定。 这是标准代码使用这些批注的逻辑方式。


#5楼

我想强调@Jules这个问题的回答 。 该注释带来了一个有用的连接: 带有@ Resource,@ Autowired和@Inject的Spring Injection 。 我鼓励您完整阅读它,可是这里简要概述了它的有用性:

注释如何选择正确的实现?

@Autowired@Inject

  1. 按类型匹配
  2. 受预选赛限制
  3. 按名称匹配

@Resource

  1. 按名称匹配
  2. 按类型匹配
  3. 受限定词限制(若是按名称找到匹配项则忽略)

我应该使用哪些注释(或它们的组合)来注入个人bean?

  1. 明确命名您的组件[@Component(“ beanName”)]

  2. @Resourcename属性[@Resource(name =“ beanName”)]一块儿使用

为何我不该该使用@Qualifier

除非要建立相似bean的列表,不然避免使用@Qualifier批注。 例如,您可能想用特定的@Qualifier批注标记一组规则。 这种方法使将一组规则类注入到可用于处理数据的列表中变得很简单。

注入豆会减慢个人程序吗?

扫描组件的特定程序包[context:component-scan base-package="com.sourceallies.person"] 。 虽然这将致使更多的component-scan配置,但它减小了将没必要要的组件添加到Spring上下文的机会。


参考: 使用@ Resource,@ Autowired和@Inject进行Spring注入

相关文章
相关标签/搜索