注入和资源以及自动注释

时间:2013-12-08 07:20:30

标签: spring dependency-injection annotations cdi autowired

@Inject@Resource以及@Autowired注释之间的区别是什么?

我们什么时候应该使用它们?

3 个答案:

答案 0 :(得分:111)

@ Inject与@Autowire与@Resource之间的区别?

@Autowired:弹簧适当性注释(与@Inject和@Resource相反),它按类型注入资源,即通过注释字段或承包商的接口类。如果我们很少实现接口或子类,我们可以使用@Qualifier注释缩小选择范围以避免歧义。对于回退匹配,bean名称被视为默认限定符值。虽然您可以使用此约定来按名称引用特定bean,但@Autowired基本上是关于带有可选语义限定符的类型驱动注入。

@Inject:基于JSR-330(Java的依赖注入)的注释可识别可注入的构造函数,方法和字段。这个注释几乎是Spring的@Autowired注释的完全替代品。因此,您可以选择使用@Inject,而不是使用特定于Spring的@Autowired注释。 @Autowired和@Inject之间的区别之一是@Inject没有必需的字段,所以如果我们找不到合适的注入对象,它将失败,而@Autowired可以使用required = false并允许null able字段(仅限)如果需要!)。 @Inject注释的优点是,不是直接注入引用,而是可以请求@Inject注入Provider。 Provider接口允许延迟注入bean引用和注入bean的多个实例等。 如果我们很少实现接口或子类,我们可以使用@Named注释缩小选择范围以避免歧义。 @Named注释很像Spring的@Qualifier

基于JSR-250的

@Resource:注释。 @Resource与@Autowired和@Inject非常相似,但主要区别在于找出要注入的所需bean的执行路径。 @Resource将首先按名称缩小搜索范围,然后按类型缩小搜索范围,最后按限定符缩小搜索范围(如果按名称找到匹配则忽略)。 @Autowired和@Inject将首先按类型缩小搜索范围,然后按限定符缩小搜索范围,最后缩小名称。

答案 1 :(得分:13)

|------------|---------------|---------------|---------------|-----------------------|
|            | Setter/Field  | Constructor   | Applicable to | Matching order        |
|            | injection     | injection     | type          |                       |
|------------|---------------|---------------|---------------|-----------------------|
| @Autowired |       X       |       X       |               | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|
| @Inject    |       X       |       X       |               | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|
| @Resource  |       X       |               |       X       | Name, Type, Qualifier |
|------------|---------------|---------------|---------------|-----------------------|

因此,Spring依赖注入@Inject@Autowired具有完全相同的行为。

答案 2 :(得分:1)

除了@Haim回答there is good description Spring和JSR-330(Java的依赖注入)注释之间的区别以及如何在Spring中使用last。