一尘不染

@Resource vs @Autowired

spring

我应该在DI中使用哪个批注@Resource(jsr250)@Autowired(特定于Spring)?

我已经成功地在过去使用两种,@Resource(name="blah")@Autowired @Qualifier("blah")

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


阅读 413

收藏
2020-04-11

共2个答案

一尘不染

在3.0之前的spring中,哪一个都不重要。

在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 允许你将其标记为非强制性。
2020-04-11
一尘不染

@Autowired(或@Inject)和两者均@Resource能很好地工作。但是在概念上或意义上存在差异

  • @Resource意味着给我一个已知资源的名字。该名称是从带注释的设置器或字段的名称中提取的,或者是从名称-Parameter中获取的。
  • @Inject或者@Autowired尝试按类型连接合适的其他组件。
    因此,基本上,这是两个截然不同的概念。不幸的是,的Spring-Implementation @Resource具有内置的后备功能,当解析按名称失败时会启用该功能。在这种情况下,它会@Autowired按类型退回到-kind resolution。虽然这种后备方式很方便,但是恕我直言,它引起了很多混乱,因为人们没有意识到概念上的差异,并且倾向于将其@Resource用于基于类型的自动装配。
2020-04-11