关于java: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注释。EDCOX1 1是Java Java 6(JSR-99)中引入的Java CDI(上下文和依赖注入)标准的一部分,请阅读更多内容。Spring选择支持使用@Inject与它们自己的@Autowired注释同义。

所以,为了回答您的问题,@Autowired是Spring自己的(遗留)注释。EDCOX1 1是一种新的Java技术的一部分,称为CDI,它定义了类似于Spring的依赖注入的标准。在一个Spring应用程序中,这两个注释的工作方式与Spring决定支持一些JSR-299注释的方式相同。


这是一篇比较@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"。

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


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

但是在使用@Inject时,提供程序接口与bean一起工作,这意味着bean不是直接注入的,而是与提供程序一起注入的。


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

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


@Autowired@Inject之间的关键区别(在读取Spring文档时注意到)是,@Autowired具有"必需"属性,@inject没有"必需"属性。


最好一直使用@inject。因为它是Java配置方法(由Sun提供),这使得我们的应用程序对框架不可知。所以,如果你也春天,你的课程将工作。

如果使用@autowired,它将只与spring一起使用,因为@autowired是spring提供的注释。


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

EDCOX1 1注释是一个标准注释,它是在标准的"依赖注入Java"(JSR-330)中定义的。Spring(从3.0版开始)支持在标准JSR-330中定义的依赖注入的通用模型。(GoogleGuice框架和Picocontainer框架也支持这个模型)。

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

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

@Autowired批注不同,@Inject批注没有required属性。因此,如果找不到依赖项-将引发异常。

对结合性质的澄清也存在差异。如果在选择用于注入的组件时存在歧义,则应添加@Named限定符。在类似情况下,@Autowired注释将添加@Qualifier限定符(jsr-330定义它自己的@Qualifier注释,并通过该限定符注释定义@Named)。


@Inject没有'required'属性


除上述内容外:

  • @autowired beans的默认范围是singleton,而使用jsr 330@inject注释则类似于Spring的prototype
  • 在使用@inject的JSR 330中没有等价的@lazy
  • 在使用@inject的JSR 330中没有等价的@value

  • @Inject注释是JSR-330注释集合之一。它具有按类型匹配、按限定符匹配、按名称匹配执行路径。这些执行路径对setter和field注入都有效,@Autowired注释的行为与@Inject注释相同。唯一的区别是@Autowired注释是Spring框架的一部分。@Autowired注释还具有上述执行路径。因此,我建议您使用@Autowired作为答案。