繁体   English   中英

Spring Framework 中@Inject 和@Autowired 的区别是什么? 在什么条件下使用哪一个?

[英]What is the difference between @Inject and @Autowired in Spring Framework? Which one to use under what condition?

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

这是一段代码:

@Inject private CustomerOrderService customerOrderService;

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

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

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

这是一篇比较@Resource@Inject@Autowired博客文章,看起来做得非常全面。

从链接:

除了测试 2 和 7 之外,配置和结果是相同的。 当我深入了解时,我确定 '@Autowired' 和 '@Inject' 注释的行为相同。 这两个注释都使用“AutowiredAnnotationBeanPostProcessor”来注入依赖项。 '@Autowired' 和 '@Inject' 可以互换使用以注入 Spring bean。 但是,“@Resource”注释使用“CommonAnnotationBeanPostProcessor”来注入依赖项。 即使它们使用不同的后处理器类,它们的行为也几乎相同。 下面是它们的执行路径的摘要。

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

结论应为您提供所需的所有信息。

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

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

从 Spring 3.0 开始,Spring 支持 JSR-330 依赖注入注解(@ @Inject 、@ @Named 、@ @Singleton )。

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

@Autowired@Inject之间的主要区别(在阅读Spring Docs时注意到)在于,@ @Autowired具有“required”属性,而 @Inject 没有“required”属性。

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

如果您使用@Autowired,它将仅适用于 spring,因为 @Autowired 是 spring 提供的注释。

除上述之外:

  1. @Autowired beans 的默认范围是Singleton而使用 JSR 330 @Inject annotation 它就像Spring 的 prototype
  2. 在使用@Inject JSR 330 中没有等效的 @Lazy 。
  3. JSR 330 中没有使用@Inject的 @Value 等效项。

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

@Inject注解是标准注解,在标准的《Java 依赖注入》(JSR-330) 中定义 Spring(从 3.0 版本开始)支持标准 JSR-330 中定义的依赖注入的广义模型。 Google Guice 框架Picocontainer 框架也支持这种模型)。

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

注释@Inject@Autowired - 几乎是完整的类比。 除了@Autowired注解,@ @Inject注解还可用于自动绑定属性、方法和构造函数。

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

对绑定属性的说明也存在差异。 如果注入组件的选择存在歧义,则应添加@Named限定符。 在类似的情况下,@ @Autowired注释将添加@Qualifier限定符(JSR-330 定义了它自己的@Qualifier注释并通过这个限定符注释@Named被定义)。

@Inject没有“必需”属性

@Autowired批注用于在Spring框架中自动布线。 实际上,自动装配是一个过程,在该过程中,Spring框架而不是您(开发人员)会在应用程序上下文文件中明确指定Spring Bean的依赖关系。 您可以使用@Autowired注释字段和构造函数,以告诉Spring框架为您找到依赖项。

@Inject注释也具有相同的目的。 @Inject注释是标准JSR-330:Java依赖注入的一部分,但是它们之间的主要区别是@Inject是依赖注入的标准注释,而@Autowired是特定于Spring的。 因此,如果您不想使用特定于Spring的注释,而希望使用标准注释,请使用@Inject。

关键事实

  • 第一个也是最重要的区别是@Inject注释仅从Spring 3.0开始可用,因此,如果要在Spring 2.5中使用注释驱动的依赖项注入,则必须使用@Autowired注释。
  • 这两个注释之间的第二个区别是,与Spring的@Autowired不同,@ Inject不需要'required'属性。
  • 注释@Inject可移植。 由于@Autowired是特定于Spring框架的,因此即使应用程序保持不变,您也需要重新实现注入依赖项的整个逻辑。

以下Baeldung文章将演示与依赖项注入相关的注释的使用,即@ Resource,@ Inject和@Autowired注释。

在春季布线:@ Autowired,@ Resource和@Inject

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM