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

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

下面是一段代码:

@Inject private CustomerOrderService customerOrderService;

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

357974 次浏览

这是一个博客文章,它比较了@Resource@Inject@Autowired,看起来做得很全面。

从链接:

除了测试2和7,配置和结果是一模一样。当我查看引擎盖下时,我确定'@Autow的'和'@Inject'注释的行为相同。两者这些注解使用'AutowiredAnnote ationBeanPostProc的'注入依赖项。可以使用'@自动加载'和'@Inject'可互换以注入Spring bean。但是'@Resource'注解使用“公共注解BeanPost处理器”注入依赖关系。即使它们使用不同的后处理器类它们的行为几乎相同。下面是他们的总结执行路径。

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

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

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

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

为了处理没有接线的情况,可以使用将@Autowiredrequired属性设置为false的bean。

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

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

关于它们有一个Spring留档中的单独部分,包括与它们的Spring等价物的比较。

@Inject没有“必需”属性

除上述之外:

  1. @Autowired bean的默认范围是Singleton,而使用JSR 330@Inject注释则类似于Spring的原型
  2. 在JSR 330中没有使用@Inject的@Lazy等效。
  3. 在使用@Inject的JSR 330中没有等同于@Value的东西。

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

@Inject注释是标准注释,在标准Java的依赖注入(JSR-330)中定义。Spring(从3.0版开始)支持标准JSR-330中定义的依赖注入的通用模型。(google guice框架pico容器框架也支持这个模型)。

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

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

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

绑定属性的澄清也有差异。如果注入组件的选择有歧义,应该添加@Named限定符。在@Autowired注释的类似情况下,将添加@Qualifier限定符(JSR-330定义了它自己的@Qualifier注释,并通过此限定符定义了@Named注释)。

@Autowired@Inject之间的关键区别(在阅读Spring Docs时注意到)是,@Autowired具有“必需”属性,而@Inject没有“必需”属性。

最好一直使用@Inject。因为它是java配置方法(由sun提供),使我们的应用程序与框架无关。所以如果你也弹出,你的类就会工作。

如果您使用@Autow的,它将只适用于Spring,因为@Autow的是Spring提供的注释。

@Inject注释是JSR-330注释集合之一。这有按类型匹配、按限定符匹配、按名称匹配执行路径。这些执行路径对setter和字段注入都有效。@Autowired注解的行为与@Inject注解相同。唯一的区别是@Autowired注解是Spring框架的一部分。@Autowired注解也有上述执行路径。所以我推荐@Autowired作为你的答案。

@自动连线(必需=假)默认情况下,必须满足@Autow的依赖注入,因为默认情况下所需属性的值为true。我们可以通过使用@Autow的来改变这种行为。在这种情况下,如果没有找到bean进行依赖注入,它不会通过错误。

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

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