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

下面是这段代码:

@注入私有CustomerOrderService

我不确定@Inject和@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),如果没有找到依赖项,它将不会通过错误

假设这里引用的是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。因为它是java配置方法(由sun提供),这使得我们的应用程序对框架不可知。所以如果你spring你的类也可以工作。

如果你使用@Autowired,它将只对spring起作用,因为@Autowired是spring提供的注释。

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

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

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