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

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

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

【问题讨论】:

标签: spring dependency-injection annotations cdi autowired


【解决方案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 具有完全相同的行为。

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多