我浏览了SpringSource上的一些博客,其中一个博客的作者使用了@Inject,我想他也可以使用@Autowired。
下面是这段代码:
@注入私有CustomerOrderService
我不确定@Inject和@Autowired之间的区别,如果有人解释他们的区别,在什么情况下使用哪个,我会很感激的。
我浏览了SpringSource上的一些博客,其中一个博客的作者使用了@Inject,我想他也可以使用@Autowired。
下面是这段代码:
@注入私有CustomerOrderService
我不确定@Inject和@Autowired之间的区别,如果有人解释他们的区别,在什么情况下使用哪个,我会很感激的。
当前回答
除上述外:
@Autowired bean的默认作用域是Singleton,而使用JSR 330 @Inject注释时,它就像Spring的原型。 在JSR 330中,没有使用@Inject的@Lazy的等等物。 在JSR 330中,没有使用@Inject的@Value的等效物。
其他回答
@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)。
假设这里引用的是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注释是JSR-330注释集合之一。这有按类型匹配,按限定符匹配,按名称匹配执行路径。 这些执行路径对setter和字段注入都有效。@Autowired注释的行为与@Inject注释相同。唯一的区别是@Autowired注释是Spring框架的一部分。@Autowired注释也有上面的执行路径。所以我推荐@Autowired来回答你的问题。
这是一篇比较@Resource, @Inject和@Autowired的博客文章,似乎做了相当全面的工作。
从链接:
With the exception of test 2 & 7 the configuration and outcomes were identical. When I looked under the hood I determined that the ‘@Autowired’ and ‘@Inject’ annotation behave identically. Both of these annotations use the ‘AutowiredAnnotationBeanPostProcessor’ to inject dependencies. ‘@Autowired’ and ‘@Inject’ can be used interchangeable to inject Spring beans. However the ‘@Resource’ annotation uses the ‘CommonAnnotationBeanPostProcessor’ to inject dependencies. Even though they use different post processor classes they all behave nearly identically. Below is a summary of their execution paths.
作者引用的测试2和测试7分别是“按字段名注入”和“试图使用坏的限定符解析bean”。
结论应该给你所有你需要的信息。
@ autowired(要求= false) 默认情况下,@Autowired的依赖注入必须完成,因为required属性的值默认为true。我们可以通过使用@Autowired(required=false)来改变这种行为。在这种情况下,如果bean没有被发现用于依赖注入,它将不会通过错误。
请看一下 https://www.concretepage.com/spring/spring-autowired-annotation#required-false
但是@Inject不需要(required=false),如果没有找到依赖项,它将不会通过错误