Answers:
在3.0之前的春季中,哪一个都不重要。
在Spring 3.0中,支持标准(JSR-330)注释@javax.inject.Inject
-结合使用可以使用它@Qualifier
。请注意,spring现在还支持@javax.inject.Qualifier
元注释:
@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
允许您将其标记为非强制性。foo
或SomeBean
带有Foo
param 的构造函数?
@Resource
和@Autowired
实际的答案是一个张贴@Ichthyo,我觉得这一个必须被更新。
@Autowired
(或@Inject
)和两者均@Resource
能很好地工作。但是在概念上或意义上存在差异
@Resource
意味着给我一个已知的名字。该名称是从带注释的设置器或字段的名称中提取的,或者是从名称-Parameter中获取的。@Inject
或者@Autowired
尝试按类型连接合适的其他组件。因此,基本上,这是两个截然不同的概念。不幸的是,的Spring-Implementation @Resource
具有内置的后备功能,当解析名称失败时,该后备功能会加入。在这种情况下,它会@Autowired
按类型退回到-kind resolution。虽然这种后备方式很方便,但是恕我直言,它引起了很多混乱,因为人们没有意识到概念上的差异,并且倾向于将其@Resource
用于基于类型的自动装配。
@Resource
注释的字段,并且字段名称与容器中的bean的ID匹配,则Spring org.springframework.beans.factory.BeanNotOfRequiredTypeException
如果它们的类型不同,则会抛出 该异常-这是因为bean首先在@Resource
注释中按名称而不是按类型进行匹配。但是,如果该属性的名称与Bean的名称不匹配,那么Spring将按类型将它们连接起来。
@Autowire
它既不会也不会工作。@Resource
在这种情况下,您将不得不使用。
主要区别是@Autowired
弹簧注释。而@Resource
由JSR-250指定的,正如你所指出自己。因此,后者是Java的一部分,而前者是特定于Spring的。
因此,从某种意义上说,您的建议是正确的。我发现人们可以使用它@Autowired
,@Qualifier
因为它更强大。从某个框架过渡到另一个框架被认为是不可能的,即使不是神话,尤其是在Spring的情况下。
@Autowired
有@Qualifier
真正的威力比JSR标准@Resource
注释(可选认为依赖例如用@Autowired(required=false)
,你不能做到这一点与@Resource
)
我想强调从一个评论@Jules对这个回答这个问题。该评论带来了一个有用的链接:带有@ Resource,@ Autowired和@Inject的Spring Injection。我鼓励您完整阅读它,但是这里简要概述了它的有用性:
@Autowired
和 @Inject
@Resource
明确命名您的组件[@Component(“ beanName”)]
使用@Resource
与name
属性[@Resource(名称= “beanName”)]
@Qualifier
?@Qualifier
除非要创建类似bean的列表,否则应避免使用注释。例如,您可能想用特定的@Qualifier
注释标记一组规则。这种方法使将一组规则类注入到可用于处理数据的列表中变得很简单。
扫描特定程序包中的组件[context:component-scan base-package="com.sourceallies.person"]
。虽然这将导致更多的component-scan
配置,但它减少了将不必要的组件添加到Spring上下文的机会。
这是我从Spring 3.0.x参考手册中获得的:
小费
如果您打算通过名称表示注释驱动的注入,则即使技术上可以通过@Qualifier值引用bean名称,也不要主要使用@Autowired。而是使用JSR-250 @Resource批注,该批注的语义定义是通过其唯一名称标识特定的目标组件,而声明的类型与匹配过程无关。
由于这种语义差异的特定结果,本身定义为集合或映射类型的bean无法通过@Autowired注入,因为类型匹配不适用于它们。对此类bean使用@Resource,通过唯一名称引用特定的collection或map bean。
@Autowired适用于字段,构造函数和多参数方法,从而允许在参数级别缩小限定符注释的范围。相比之下,只有具有单个参数的字段和bean属性设置器方法才支持@Resource。因此,如果您的注入目标是构造函数或多参数方法,请坚持使用限定符。
@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可以放置占位符并使用属性文件注入特定的子实现,例如
@Resource(name="${service.name}")
Parent object;
在属性文件中将service.name设置为
#service.name=actualService
service.name=stubbedService
希望能帮助到某人:)
他们两个都一样好。使用Resource的优势在于将来如果您希望使用除Spring之外的其他DI框架,则代码更改将更加简单。使用自动装配,您的代码与弹簧DI紧密结合。
从这两个批注的基类进行批判性分析时,您将意识到以下差异。
@Autowired
用于AutowiredAnnotationBeanPostProcessor
注入依赖项。
@Resource
用于CommonAnnotationBeanPostProcessor
注入依赖项。
即使它们使用不同的后处理器类,它们的行为也几乎相同。差异主要在于它们的执行路径,下面我将重点介绍它们。
@Autowired / @Inject
1.按类型
匹配2.按预选赛
限制3.按名称匹配
@Resource
1.按名称
匹配2.按类型
匹配3.按限定词限制(如果按名称找到匹配项则忽略)
用 @Resource
bean自我注入,可能需要运行bean后处理器添加的所有额外逻辑,例如事务性或与安全性相关的东西。
使用Spring 4.3+ @Autowired
也可以做到这一点。
@Resource
通常由通过JNDI定义的高级对象使用。@Autowired
或@Inject
将由更常见的豆使用。
据我所知,它不是规范,也不是约定。这是标准代码使用这些批注的逻辑方式。