[英]What is the difference between the use of @Import and @ImportResource annotations in Spring framework?
[英]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 提供的注释。
除上述之外:
@Autowired
beans 的默认范围是Singleton而使用 JSR 330 @Inject
annotation 它就像Spring 的 prototype 。@Inject
JSR 330 中没有等效的 @Lazy 。@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。
关键事实
以下Baeldung文章将演示与依赖项注入相关的注释的使用,即@ Resource,@ Inject和@Autowired注释。
@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.