755

我正在浏览 SpringSource 上的一些博客,在其中一个博客中,作者正在使用@Inject,我想他也可以使用@Autowired.

这是一段代码:

@Inject private CustomerOrderService customerOrderService;

我不确定和之间的区别,如果有人解释了他们的区别@Inject以及@Autowired在什么情况下使用哪个,我将不胜感激?

4

11 回答 11

779

假设您在这里指的是javax.inject.Inject注释。@Inject是 Java EE 6 (JSR-299) 中引入的 Java CDI(上下文和依赖注入)标准的一部分,阅读更多。Spring 选择支持使用@Inject与他们自己的注解同义的@Autowired注解。

因此,要回答您的问题,@Autowired是 Spring 自己的注释。@Inject是称为 CDI 的 Java 技术的一部分,该技术定义了类似于 Spring 的依赖注入标准。在 Spring 应用程序中,这两个注解的工作方式与 Spring 决定支持一些 JSR-299 注解的方式相同。

于 2011-08-22T07:08:15.090 回答
169

这是一篇比较、、 和的博客文章,看起来做得相当全面。@Resource@Inject@Autowired

从链接:

除了测试 2 和 7 之外,配置和结果是相同的。当我深入了解时,我确定“@Autowired”和“@Inject”注释的行为相同。这两个注释都使用“AutowiredAnnotationBeanPostProcessor”来注入依赖项。'@Autowired' 和 '@Inject' 可以互换使用来注入 Spring bean。但是,“@Resource”注释使用“CommonAnnotationBeanPostProcessor”来注入依赖项。即使它们使用不同的后处理器类,它们的行为也几乎相同。以下是它们的执行路径的摘要。

作者引用的测试 2 和 7 分别是“按字段名称注入”和“尝试使用错误的限定符解析 bean”。

结论应该为您提供所需的所有信息。

于 2011-08-22T05:28:37.087 回答
41

为了处理没有布线的情况,可以使用@Autowired required属性设置为 的bean false

但是在使用时@Inject,Provider 接口与 bean 一起工作,这意味着 bean 不是直接注入的,而是与 Provider 一起注入的。

于 2012-01-25T14:27:02.560 回答
28

和之间的关键区别(在阅读Spring Docs时注意到)是具有“必需”属性,而 @Inject 没有“必需”属性。@Autowired@Inject@Autowired

于 2015-11-17T09:39:20.213 回答
26

从 Spring 3.0 开始,Spring 提供对 JSR-330 依赖注入注解 ( @Inject, @Named, @Singleton) 的支持。

Spring 文档中有一个单独的部分关于它们,包括与它们的 Spring 等效项的比较。

于 2013-07-17T09:17:05.207 回答
16

最好始终使用@Inject。因为它是 java 配置方法(由 sun 提供)使我们的应用程序与框架无关。因此,如果您也弹跳,您的课程也将起作用。

如果您使用 @Autowired 它仅适用于 spring,因为 @Autowired 是 spring 提供的注释。

于 2015-11-26T17:27:37.683 回答
14

除上述内容外:

  1. @Autowiredbean的默认范围是Singleton,而使用 JSR 330@Inject注释它就像Spring 的原型
  2. 在 JSR 330 中使用@Inject.
  3. 在 JSR 330 中使用@Inject.
于 2015-06-22T03:39:50.603 回答
14

@Autowired注解是在 Spring 框架中定义的。

@Injectannotation 是标准注解,在标准“Java 依赖注入”(JSR-330)中定义。Spring(从 3.0 版开始)支持标准 JSR-330 中定义的依赖注入的通用模型。(Google Guice 框架Picocontainer 框架也支持这个模型)。

With@Inject可以注入对 Provider接口实现的引用,这允许注入延迟引用。

注释@Inject@Autowired- 几乎是完全的类比。除了@Autowired注解,@Inject注解还可用于自动绑定属性、方法和构造函数。

@Autowired注解相比,@Inject注解没有required属性。因此,如果找不到依赖项 - 将抛出异常。

绑定属性的说明也存在差异。如果注射成分的选择不明确,@Named则应添加限定词。在类似的情况下,@Autowired注释将被添加@Qualifier限定符(JSR-330 定义它自己的@Qualifier注释并通过此限定符@Named定义注释)。

于 2015-10-08T12:15:43.040 回答
12

@Inject没有“必需”属性

于 2014-08-19T09:44:26.200 回答
0

@Inject注释是 JSR-330 注释集合之一。这具有按类型匹配、按限定符匹配、按名称匹配执行路径。这些执行路径对 setter 和字段注入都有效。@Autowired注解的行为与注解相同@Inject。唯一的区别是@Autowired注解是 Spring 框架的一部分。@Autowiredannotation 也有上面的执行路径。所以我推荐@Autowired你的答案。

于 2018-04-11T09:59:55.980 回答
0

@Autowired(required=false) 默认情况下,必须满足 @Autowired 的依赖注入,因为 required 属性的值默认为 true。我们可以使用@Autowired(required=false) 来改变这种行为。这种情况下如果没有找到依赖注入的bean,就不会报错。

请查看 https://www.concretepage.com/spring/spring-autowired-annotation#required-false

但是@Inject 不需要 (required=false) 如果没有找到依赖,它不会通过错误

于 2020-06-18T08:15:20.143 回答