在Spring Framework中@Inject和@Autowired有什么区别?在什么条件下使用哪一个?


694

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

这是一段代码:

@Inject private CustomerOrderService customerOrderService;

我不知道之间的区别@Inject@Autowired,如果有人解释他们的区别将不胜感激,什么情况下要使用哪一个?


3
我没有答案,因为我也是新手,但这可能对sakaenakajima.wordpress.com/2010/08/10/…–
Sagar V


2
“@注入”和“@Autowired”之间的差额,这篇文章很好地解释alextheedom.wordpress.com/2016/02/13/...
亚历Theedom

Answers:


718

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

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


115
因此,从理论上讲,如果使用@Inject,则可以用另一个DI框架(例如Guice)替换spring,并以相同的方式注入依赖项。
亚历克斯·巴恩斯

71
冒着学究的风险:@Inject将JSR(JSR-330)与CDI(JSR-299)分开。
布拉德·库比

36
当然,如果仅依赖JSR- *注释,则可以替换DI框架。但是你会吗?一旦开始使用spring,很有可能您已经使用了不止DI了。您不仅会做出改变;即使您这样做了,也要采取行动或中断行动的并不是少数搜索和替换。另一方面,Spring自己的注释为您提供了更多功能。掌握一个良好的框架将为您带来更多的收益。
阿格斯顿霍瓦斯(Agoston Horvath)

18
我同意您的看法,我们不会经常更改DI框架。但是,如果我们的源代码包含多个软件包,并且您想构建一个要在多个项目之间共享的通用软件包,那么使用@InjectJSR注释比使用@Autowiredspring DI锁定代码库更好。
Aditya

3
@Inject单独使用将无法确保框架的独立性。您还需要声明可注入bean,而无需使用依赖于框架的机制(例如Spring的@Component或)application.xml,而在类级别使用@Named@Singleton。不知道今天是否有任何Spring项目真的声明过这样的豆-我什至从未听说过任何从Spring迁移到JEE的项目...
Marcus

162

这是一篇比较@Resource@Inject和的博客文章@Autowired似乎做得很全面。

从链接:

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

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

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


4
那篇文章很好地解释了这三个注释。第一次滑动后我不得不重新阅读;但是,一篇很棒的文章。
托马斯

1
非常感谢!在寻找Spring和JavaEE之间的异同以及其他一些问题时,本文回答了我的多个答案。
凯文·克鲁伊森

36

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

但是,当使用时@Inject,Provider接口可与Bean一起使用,这意味着不会直接注入Bean,而是与Provider一起注入。


8
这是如此重要,并且在最不赞成的答案中被忽略了。
伊戈尔·多宁

默认情况下,“自动装配”的必需参数设置为true。参考:docs.spring.io/spring-framework/docs/current/javadoc-api/org/…– 2013
安静的

25

在Spring 3.0中,Spring提供的JSR-330的依赖注入注解支持(@Inject@Named@Singleton)。

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


这里的问题是,当您说Spring支持JSR时,您是什么意思?容器不支持独立于Spring的JSR,并且不要求容器符合J2EE吗?您是说它包装了功能吗?如果Spring不“支持”它,那么默认情况下javax的注解是否仍然有效?
丹·蔡斯

在JEE容器中运行Spring不是必须的,您也可以在Tomcat等Servlet / JSP容器中使用它,并且仍然具有JSR-330支持。Spring是一个单独的DI容器,如果您的意思是,它不会与主机JEE服务器“互换” CDI bean。您既可以在JEE容器中使用CDI,也可以在Spring bean中使用CDI-但不能同时使用(开箱即用)。
安德烈·斯特林格

22

关键的区别(阅读时注意春季文档之间)@Autowired@Inject是,@Autowired有“必要”的属性,而@Inject已经没有“必要”的属性。


您所说的要求是什么意思?
mattyman

2
@mattymanme在文档中,“默认情况下,只要有零个候选bean可用,自动装配就会失败;默认行为是将带注释的方法,构造函数和字段视为指示所需的依赖项。可以通过将required属性设置为false来更改此行为。 ”。例如:@Autowired(required=false)。简单来说, “该required属性表示该属性对于自动装配不是必需的,如果该属性不能自动装配,则将其忽略。”
2016年

查看源代码公共接口Autowired {/ ** *声明是否需要带注释的依赖项。* / boolean required()默认为true; }公共接口Inject {}
Tarn

15

最好一直使用@Inject。因为是java配置方法(由sun提供),这使我们的应用程序与框架无关。因此,如果您还弹奏了您的课程,那么他们将上课。

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


13
太阳死了。太阳万岁。
Amrinder Arora

6
您打算多久更改一次框架?只是好奇

在大多数项目中,我看到的是Autowired而不是Inject。我了解答案的原理,但我不能投票。
Witold Kaczurba,

13

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

@Inject注解是标准的注解,在标准的“ 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定义了注释)。


即使'@Inject'没有必需的属性,Java Docs的状态也是如此:需要注入带有'@Inject'注释的成员。这似乎暗示着,如果找不到成员,则注入将失败。请参阅Java文档:docs.oracle.com/javaee/7/api/javax/inject/Inject.html
Alex Theedom,2016年


12

除了上述内容:

  1. @Autowiredbean 的默认范围是Singleton,而使用JSR 330 @Inject注释则类似于Spring的prototype
  2. 在JSR 330中,没有使用@Lazy的等效项@Inject
  3. 在JSR 330中,没有使用@Value等效@Inject

0

@Inject注释是JSR-330的注释集合中的一个。它具有按类型匹配,按限定符匹配,按名称匹配执行路径。这些执行路径对setter和field注入均有效。@Autowired注解的行为与注解相同@Inject。唯一的区别是@Autowired注释是Spring框架的一部分。@Autowired注释也具有上述执行路径。因此,我建议@Autowired您选择答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.