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

下面是这段代码:

@注入私有CustomerOrderService

我不确定@Inject和@Autowired之间的区别,如果有人解释他们的区别,在什么情况下使用哪个,我会很感激的。


当前回答

@Inject没有'required'属性

其他回答

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

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

@Inject注释是一个标准注释,在标准的“Java依赖注入”(JSR-330)中定义。Spring(从3.0版本开始)支持在标准JSR-330中定义的依赖项注入的通用模型。(谷歌Guice框架和Picocontainer框架也支持这个模型)。

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

注释@Inject和@Autowired——几乎是完全的类比。和@Autowired注释一样,@Inject注释也可以用于自动绑定属性、方法和构造函数。

与@Autowired注释相反,@Inject注释没有必需的属性。因此,如果没有找到依赖项-将抛出异常。

在结合性质的澄清方面也存在差异。如果在为注入选择组件时存在歧义,则应该添加@Named限定符。在类似的情况下,@Autowired注释将添加@Qualifier限定符(JSR-330定义了它自己的@Qualifier注释,并通过这个限定符注释定义@Named)。

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

Spring文档中有一个关于它们的单独章节,包括与它们的Spring等价物的比较。

要处理没有连接的情况,可以使用将@Autowired required属性设置为false的bean。

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

@ autowired(要求= false) 默认情况下,@Autowired的依赖注入必须完成,因为required属性的值默认为true。我们可以通过使用@Autowired(required=false)来改变这种行为。在这种情况下,如果bean没有被发现用于依赖注入,它将不会通过错误。

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

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