Spring框架中的@Inject和@Autowired有什么区别? 在什么情况下使用哪一个?

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

这是一段代码:

@Inject private CustomerOrderService customerOrderService;

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

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

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

这是一篇比较@Resource ,@ @Inject@Autowired的博客文章 ,似乎做了一个非常全面的工作。

从链接:

除了testing2和7,configuration和结果是相同的。 当我查看引擎盖时,我确定“@Autowired”和“@Inject”注释的行为是一致的。 这两个注释都使用“AutowiredAnnotationBeanPostProcessor”来注入依赖关系。 '@Autowired'和'@Inject'可以互换使用来注入Spring bean。 然而'@Resource'注解使用'CommonAnnotationBeanPostProcessor'来注入依赖关系。 即使他们使用不同的后处理器类,它们的performance几乎完全相同。 下面是他们的执行path的总结。

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

结论应该给你所有你需要的信息。

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

但是当使用@Inject ,Provider接口和bean一起工​​作,这意味着这个bean不是直接注入的,而是和Provider一起注入的。

从Spring 3.0开始,Spring支持JSR-330dependency injection注释(@ @Inject ,@ @Named ,@ @Singleton )。

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

@Autowired@Inject之间关键的显着差异(在阅读Spring Docs时注意到)是,@ @Autowired具有“required”属性,而@Inject没有“required”属性。

@Inject没有“必需”属性

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

@Inject注解是一个标准注释,它在标准的“Java的dependency injection”(JSR-330)中定义 。 Spring(自3.0版本以来)支持在标准JSR-330中定义的dependency injection的广义模型。 ( Google Guice框架和Picocontainer框架也支持这种模式)。

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

Annotations @Inject@Autowired – 几乎完全类比。 和@Autowired注解一样,@ @Inject注解可以用于自动绑定属性,方法和构造函数。

@Autowired注释相比,@ @Inject注释没有required属性。 因此,如果依赖不会被发现 – 将被抛出exception。

在结合性质的澄清方面也有不同。 如果注入组件的select存在歧义,则应添加@Named限定符。 在@Autowired注解的类似情况下,将添加@Qualifier限定符(JSR-330定义它自己的@Qualifier注释并通过此限定符注释@Named被定义)。

除以上内容外:

  1. @Autowired bean的默认范围是Singleton,而使用JSR 330 @Inject注释就像Spring的prototype
  2. 在JSR 330中使用@Inject没有等价的@Lazy
  3. @Inject在JSR 330中没有相当于@Value的值

更好地使用@Inject所有的时间。 因为它是javaconfiguration方法(由sun提供),这使得我们的应用程序对框架不可知。 所以,如果你spring也是你的课程将工作。

如果你使用@Autowired它将只能用于Spring,因为@Autowired是弹簧提供的注释。