注入和资源以及自动装配注释

Posted

技术标签:

【中文标题】注入和资源以及自动装配注释【英文标题】:Inject and Resource and Autowired annotations 【发布时间】:2013-12-25 09:33:28 【问题描述】:

@Inject@Resource@Autowired 注释有什么区别?

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

【问题讨论】:

docs.spring.io/spring/docs/3.2.4.RELEASE/…, docs.spring.io/spring/docs/3.2.4.RELEASE/… @Resource vs @Autowired的可能重复 我找到的例子很好的解释是here 【参考方案1】:

@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 将首先按类型缩小搜索范围,然后按限定符,最后按名称。

【讨论】:

您能谈谈推荐的内容吗?最佳做法? 我很乐意回复您的评论,但我更愿意保持原样。你能发布一个新问题吗? 在最后一行中,您提到@Autowired 也按名称搜索,据我所知,它没有名称选项,是吗? 查看我对@Autowired 描述的更新。来自文档docs.spring.io/spring/docs/current/spring-framework-reference/…“对于回退匹配,bean 名称被视为默认限定符值。” @Jan-TerjeSørensen 我建议在任何地方都使用独立于框架的 @Inject 注释。如果您决定将 Spring 更改为例如Google Guice(或任何其他 JSR-330 DI 框架)您不会更改代码。【参考方案2】:
|------------|---------------|---------------|---------------|-----------------------|
|            | 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 具有完全相同的行为。

【讨论】:

表格中的“适用于类型”栏是什么意思? @RBz 请参阅:docs.oracle.com/javaee/6/api/javax/annotation/Resource.html“如果注释应用于组件类,则注释声明应用程序将在运行时查找的资源。”但我不确定这是否也适用于 Spring DI。【参考方案3】:

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

【讨论】:

以上是关于注入和资源以及自动装配注释的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 的自动装配依赖注入

Spring中@autowired注释的用途是啥。术语自动装配是啥意思[重复]

Spring5依赖注入常用的三种方法:构造注入Setter注入自动装配

Spring 基于自动装配的依赖注入详解 [自动装配模式搞不懂?来看就完了!!!][autowire 属性值详解][自动装配的 6 种模式]

Spring 属性依赖注入

注入自动装配的依赖项失败,无法自动装配字段