我正在浏览 SpringSource 上的一些博客,在其中一个博客中,作者正在使用@Inject
,我想他也可以使用@Autowired
.
这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不确定和之间的区别,如果有人解释了他们的区别@Inject
以及@Autowired
在什么情况下使用哪个,我将不胜感激?
我正在浏览 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”。
结论应该为您提供所需的所有信息。
为了处理没有布线的情况,可以使用@Autowired
required
属性设置为 的bean false
。
但是在使用时@Inject
,Provider 接口与 bean 一起工作,这意味着 bean 不是直接注入的,而是与 Provider 一起注入的。
和之间的关键区别(在阅读Spring Docs时注意到)是具有“必需”属性,而 @Inject 没有“必需”属性。@Autowired
@Inject
@Autowired
从 Spring 3.0 开始,Spring 提供对 JSR-330 依赖注入注解 ( @Inject
, @Named
, @Singleton
) 的支持。
Spring 文档中有一个单独的部分关于它们,包括与它们的 Spring 等效项的比较。
最好始终使用@Inject。因为它是 java 配置方法(由 sun 提供)使我们的应用程序与框架无关。因此,如果您也弹跳,您的课程也将起作用。
如果您使用 @Autowired 它仅适用于 spring,因为 @Autowired 是 spring 提供的注释。
除上述内容外:
@Autowired
bean的默认范围是Singleton,而使用 JSR 330@Inject
注释它就像Spring 的原型。@Inject
.@Inject
.@Autowired
注解是在 Spring 框架中定义的。
@Inject
annotation 是标准注解,在标准“Java 依赖注入”(JSR-330)中定义。Spring(从 3.0 版开始)支持标准 JSR-330 中定义的依赖注入的通用模型。(Google Guice 框架和Picocontainer 框架也支持这个模型)。
With@Inject
可以注入对 Provider
接口实现的引用,这允许注入延迟引用。
注释@Inject
和@Autowired
- 几乎是完全的类比。除了@Autowired
注解,@Inject
注解还可用于自动绑定属性、方法和构造函数。
与@Autowired
注解相比,@Inject
注解没有required
属性。因此,如果找不到依赖项 - 将抛出异常。
绑定属性的说明也存在差异。如果注射成分的选择不明确,@Named
则应添加限定词。在类似的情况下,@Autowired
注释将被添加@Qualifier
限定符(JSR-330 定义它自己的@Qualifier
注释并通过此限定符@Named
定义注释)。
@Inject
没有“必需”属性
@Inject
注释是 JSR-330 注释集合之一。这具有按类型匹配、按限定符匹配、按名称匹配执行路径。这些执行路径对 setter 和字段注入都有效。@Autowired
注解的行为与注解相同@Inject
。唯一的区别是@Autowired
注解是 Spring 框架的一部分。@Autowired
annotation 也有上面的执行路径。所以我推荐@Autowired
你的答案。
@Autowired(required=false) 默认情况下,必须满足 @Autowired 的依赖注入,因为 required 属性的值默认为 true。我们可以使用@Autowired(required=false) 来改变这种行为。这种情况下如果没有找到依赖注入的bean,就不会报错。
请查看 https://www.concretepage.com/spring/spring-autowired-annotation#required-false
但是@Inject 不需要 (required=false) 如果没有找到依赖,它不会通过错误