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

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

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


当前回答

@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(name="${service.name}")
Parent object;  

service.name在属性文件中设置为

#service.name=actualService
 service.name=stubbedService

希望这能帮助到一些人:)

其他回答

当您从这两个注释的基类进行严格分析时。您将认识到以下不同之处。

@Autowired使用AutowiredAnnotationBeanPostProcessor注入依赖项。 @Resource使用CommonAnnotationBeanPostProcessor注入依赖项。

尽管它们使用不同的后置处理器类,但它们的行为几乎相同。 关键的区别在于它们的执行路径,我在下面强调了这一点。

@Autowired / @Inject

1.按类型匹配 2.限定词限制 3.名称匹配

@Resource

1.名称匹配 2.按类型匹配 3.通过限定符进行限制(如果通过名称找到匹配则忽略)

@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(name="${service.name}")
Parent object;  

service.name在属性文件中设置为

#service.name=actualService
 service.name=stubbedService

希望这能帮助到一些人:)

在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允许您将其标记为非强制的。

主要的区别是,@Autowired是一个spring注释。而@Resource是由JSR-250指定的,正如您自己指出的那样。因此,后者是Java的一部分,而前者是Spring特有的。

因此,在某种意义上,你的建议是正确的。我发现人们使用@Autowired和@Qualifier,因为它更强大。从一个框架转移到另一个框架被认为是不太可能的,特别是在Spring的情况下。

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