哪个注释,@Resource (jsr250)或@Autowired (spring特定)我应该在DI中使用?

我已经成功地使用在过去,@资源(名称="blah")和@Autowired @Qualifier("blah")

我的直觉是坚持使用@Resource标签,因为它已经被jsr的人批准了。 有人对此有强烈的想法吗?


当前回答

在3.0之前的春季版本中,哪种都不重要。

spring 3.0支持标准(JSR-330)注释@javax.inject。Inject -使用它,使用@Qualifier的组合。注意,spring现在也支持@javax.inject。限定符元注释:

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

所以你可以有

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

or

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

然后:

@Inject @YourQualifier private Foo foo;

这减少了字符串名称的使用,字符串名称可能会拼写错误,并且更难维护。


至于最初的问题:两者都没有指定注释的任何属性,而是按类型执行注入。区别在于:

@Resource允许您指定注入bean的名称 @Autowired允许您将其标记为非强制的。

其他回答

他们两个都一样好。使用Resource的优势在于,如果将来您想使用spring以外的另一个DI框架,您的代码更改将会简单得多。使用Autowired您的代码与spring DI紧密耦合。

在3.0之前的春季版本中,哪种都不重要。

spring 3.0支持标准(JSR-330)注释@javax.inject。Inject -使用它,使用@Qualifier的组合。注意,spring现在也支持@javax.inject。限定符元注释:

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

所以你可以有

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

or

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

然后:

@Inject @YourQualifier private Foo foo;

这减少了字符串名称的使用,字符串名称可能会拼写错误,并且更难维护。


至于最初的问题:两者都没有指定注释的任何属性,而是按类型执行注入。区别在于:

@Resource允许您指定注入bean的名称 @Autowired允许您将其标记为非强制的。

@Resource通常由通过JNDI定义的高级对象使用。@Autowired或@Inject将被更常见的bean使用。

据我所知,这不是一个规范,甚至不是一个约定。这更像是标准代码使用这些注释的逻辑方式。

这是我从Spring 3.0中得到的。x参考手册:-

Tip If you intend to express annotation-driven injection by name, do not primarily use @Autowired, even if is technically capable of referring to a bean name through @Qualifier values. Instead, use the JSR-250 @Resource annotation, which is semantically defined to identify a specific target component by its unique name, with the declared type being irrelevant for the matching process. As a specific consequence of this semantic difference, beans that are themselves defined as a collection or map type cannot be injected through @Autowired, because type matching is not properly applicable to them. Use @Resource for such beans, referring to the specific collection or map bean by unique name. @Autowired applies to fields, constructors, and multi-argument methods, allowing for narrowing through qualifier annotations at the parameter level. By contrast, @Resource is supported only for fields and bean property setter methods with a single argument. As a consequence, stick with qualifiers if your injection target is a constructor or a multi-argument method.

我想强调一下@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注入