【发布时间】:2013-12-25 09:33:28
【问题描述】:
@Inject 和 @Resource 和 @Autowired 注释有什么区别?
我们应该什么时候使用它们?
【问题讨论】:
-
我找到的例子很好的解释是here
标签: spring dependency-injection annotations cdi autowired
@Inject 和 @Resource 和 @Autowired 注释有什么区别?
我们应该什么时候使用它们?
【问题讨论】:
标签: spring dependency-injection annotations cdi autowired
@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,而不是直接注入一个引用。 Provider 接口可以实现 bean 引用的惰性注入和 bean 的多个实例的注入。 如果我们很少实现接口或子类,我们可以使用 @Named 注释来缩小选择范围以避免歧义。 @Named 注解的工作方式很像 Spring 的 @Qualifier
@Resource: 基于 JSR-250 的注解。 @Resource 与@Autowired 和@Inject 非常相似,但主要区别在于找出需要注入的bean 所采用的执行路径。 @Resource 将首先按名称缩小搜索范围,然后按类型,最后按限定符(如果按名称找到匹配则忽略)。 @Autowired 和 @Inject 将首先按类型缩小搜索范围,然后按限定符,最后按名称。
【讨论】:
@Inject 注释。如果您决定将 Spring 更改为例如Google Guice(或任何其他 JSR-330 DI 框架)您不会更改代码。
|------------|---------------|---------------|---------------|-----------------------|
| | 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 具有完全相同的行为。
【讨论】:
除了@Haim 回答there is good description Spring 和 JSR-330(Java 的依赖注入)注解的区别以及如何在 Spring 中使用最后一个。
【讨论】: