2013-12-08 76 views
46

@Inject@Resource@Autowired注释之间有什么区别?注入和资源和自动注释注释

我们什么时候应该使用它们中的每一个?

+2

http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-standard-annotations,http://docs.spring.io /spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-resource-annotation –

+1

[@Resource vs @Autowired]的可能重复(http://stackoverflow.com/questions/4093504/resource -vs-autowired) –

+1

我发现的例子很好的解释是[这里](http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/) – marioosh

回答

94

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

@Autowired: Spring注入资源(而不是@Inject和@Resource),注入一个资源的类型,即由注释字段或承包商的接口的类。如果我们很少实现一个接口或子类,我们可以使用@Qualifier注释缩小选择范围,以避免模糊。对于回退匹配,bean名称被视为默认限定符值。尽管您可以使用此惯例通过名称引用特定的bean,但@Autowired基本上是可选的语义限定符的类型驱动注入。

@Inject:注释基于JSR-330(Java依赖注入)标识可注射的构造方法,方法和字段。这个注解是Spring的@Autowired注解的一个几乎完整的替代品。因此,您可以选择使用@Inject,而不是使用特定于Spring的@Autowired注释。 @Autowired和@Inject之间的差异之一是@Inject没有必需的字段,所以如果我们找不到合适的对象来注入它将会失败,而@Autowired可以使用required = false并允许空字段(仅限于如果需要!)。 @Inject注解的好处是,不要直接注入引用,你可以让@Inject注入一个Provider。提供者接口除其他外,还可以延迟注入bean引用和注入bean的多个实例。 如果我们很少实现一个接口或子类,我们可以使用@Named注释缩小选择范围,以避免模糊。 @Named注释的作用非常类似于Spring的@Qualifier

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

+5

你能说一些关于建议什么?最佳实践? –

+1

我很乐意回应您的评论,但我更愿意保留此答案。你会发布一个新问题吗? –

+1

在最后一行中,你提到@Autowired也按名称搜索,因为我知道它没有名称选项,是吗? –

1

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

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