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

Rac*_*hel 659 java spring dependency-injection inject autowired

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

这是一段代码:

@Inject private CustomerOrderService customerOrderService;

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

pap*_*pap 690

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

所以,回答你的问题,@Autowired是Spring自己的(遗留)注释.@Inject是一种名为CDI的新Java技术的一部分,它定义了类似于Spring的依赖注入标准.在Spring应用程序中,这两个注释的工作方式与Spring决定支持除了自己的一些JSR-299注释相同.

  • 所以从理论上讲,如果你使用@Inject,你可以用另一个DI框架替换spring,例如Guice,并以相同的方式注入你的依赖项. (108认同)
  • 有迂腐的风险:`@Inject`是CDI(JSR-299)的独立JSR(JSR-330). (67认同)
  • 如果你只依赖于JSR-*注释,那么你可以*替换你的DI框架.但是你呢?一旦你开始使用弹簧,很可能你使用的不仅仅是DI.你不会只是做出改变; 即使你这样做,也不是一些搜索和替换将会成就或打破此举.另一方面,Spring自己的注释为您提供了更多功能.掌握一个好的框架会给你带来的不仅仅是很多. (33认同)
  • 我同意你的意见,我们不经常改变DI框架.但是,如果我们的源代码有多个包,并且你想要构建一个你想要在多个项目中共享的公共包然后使用`@Inject` JSR注释比使用`@Autowired`更好地锁定你的代码库和spring DI. (18认同)
  • 单独使用`@Inject`将无法确保框架独立性.您还需要声明可注入bean,而不使用Spring的`@Component`或`application.xml`等框架相关机制,但在类级别使用`@ Named`和`@ Singleton`.不知道今天是否有任何Spring项目真正声明了这样的bean - 我甚至从未听说过任何从Spring迁移到JEE的项目...... (2认同)

nic*_*ild 155

这是一篇博客文章,比较@Resource,@Inject@Autowired,并且似乎做了相当全面的工作.

从链接:

除了测试2和7之外,配置和结果是相同的.当我查看引擎盖时,我确定'@Autowired'和'@Inject'注释的行为相同.这两个注释都使用'AutowiredAnnotationBeanPostProcessor'来注入依赖项.'@Autowired'和'@Inject'可以互换使用来注入Spring bean.但是'@Resource'注释使用'CommonAnnotationBeanPostProcessor'来注入依赖项.尽管他们使用不同的后处理器类,但它们的行为几乎完全相同.以下是其执行路径的摘要.

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

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

  • 那篇文章是对这三个注释的一个很好的解释.第一次刷卡后我不得不重新阅读; 但是,一篇优秀的文章. (3认同)

小智 34

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

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

  • 这非常重要,并且在最受欢迎的答案中被忽略了. (6认同)

And*_*ess 25

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

Spring文档中有一个单独的部分,包括与Spring等价物的比较.


Luc*_*cky 21

关键的区别(阅读时注意春季文档)之间@Autowired,并@Inject是,@Autowired有"必要"的属性,而@Inject没有"必要"的属性.

  • 你所说的必需是什么意思? (2认同)
  • @mattymanme从文档中,_"默认情况下,只要零候选bean可用,自动装配就会失败;默认行为是将带注释的方法,构造函数和字段视为指示所需的依赖关系.可以通过将所需属性设置为以下来更改此行为false"._例如:`@Autowired(required = false)`.简单来说,_"`required`属性表示该属性不是自动装配所必需的,如果无法自动装配,则忽略该属性."_ (2认同)

小智 14

最好一直使用@Inject.因为它是java配置方法(由sun提供),它使我们的应用程序与框架无关.所以,如果你春天,你的课程也会奏效.

如果你使用@Autowired它只适用于spring,因为@Autowired是spring提供的注释.

  • 太阳死了.太阳万岁. (13认同)
  • 你多久改变一次框架?只是好奇 (6认同)
  • 在大多数项目中,我看到的是 Autowired 而不是 Inject。我理解答案的基本原理,但我无法投票。 (2认同)

Myk*_*ych 12

@Inject 没有"必需"属性


Ale*_*kov 12

@Autowired 注释在Spring框架中定义.

@Injectannotation是标准注释,它在标准的"Java依赖注入"(JSR-330)中定义.Spring(自3.0版本起)支持依赖注入的通用模型,该模型在标准JSR-330中定义.(Google Guice框架Picocontainer框架也支持此模型).

@Inject可喷射的参考的实施 Provider接口,其允许注射推迟引用.

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

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

在结合特性的澄清方面也存在差异.如果注射成分的选择存在歧义,@Named则应添加限定符.在类似的情况下,@Autowired注释将添加@Qualifier限定符(JSR-330定义它自己的@Qualifier注释,并通过此限定符注释@Named定义).


小智 10

除上述内容外:

  1. @Autowired bean的默认范围是Singleton,而使用JSR 330 @Inject注释就像Spring一样@Autowired.
  2. 使用@Inject在JSR 330中没有@Lazy的等价物
  3. 使用@Inject在JSR 330中没有等效的@Value