@Resource与@Autowired

我应该在DI中使用哪个注释,@Resourcejsr250)或@Autowired(特定于弹簧)?

我过去曾成功地使用过这两种用法,并且@Resource(name="blah")@Autowired @Qualifier("blah")

我的本能是坚持使用这个标签,因为它已经得到了jsr人的批准。
有人对此有强烈的想法吗?@Resource


答案 1

两者(或)和工作同样好。但是在概念上存在差异或含义上的差异@Autowired@Inject@Resource

  • @Resource意味着按名称为我获取已知资源。该名称是从带注释的 setter 或字段的名称中提取的,或者取自 name-Parameter。
  • @Inject或尝试按类型连接合适的其他组件@Autowired

所以,基本上这是两个完全不同的概念。不幸的是,Spring-Implementation 有一个内置的回退,当按名称解析失败时,它会启动。在这种情况下,它回退到 -kind 按类型解析。虽然这种回退很方便,但恕我直言,它引起了很多混乱,因为人们没有意识到概念上的差异,并且倾向于用于基于类型的自动布线。@Resource@Autowired@Resource


答案 2

在3.0之前的春天,哪一个并不重要。

在春季3.0中,支持标准(JSR-330)注释 - 使用它,并结合.请注意,spring 现在还支持元注释:@javax.inject.Inject@Qualifier@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允许您将其标记为非强制性。

推荐