首页 文章

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

提问于
浏览
589

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

这是一段代码:

@Inject private CustomerOrderService customerOrderService;

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

10 回答

  • 28

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

    如果你使用@Autowired它只适用于spring,因为@Autowired是spring提供的注释 .

  • 18

    除上述内容外:

    • @Autowired bean的默认范围是Singleton,而使用JSR 330 @Inject注释它就像Spring的 prototype .

    • 使用@Inject在JSR 330中没有@Lazy的等价物

    • 使用@Inject在JSR 330中没有等效的@Value

  • 23

    @Autowired@Inject 之间的关键区别(在阅读Spring Docs时注意到)是, @Autowired 具有'required'属性,而@Inject没有'required'属性 .

  • 11

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

    @Inject annotation是标准注释,在标准"Dependency Injection for Java" (JSR-330)中定义 . Spring(自版本3.0起)支持依赖注入的通用模型,该模型在标准JSR-330中定义 . (Google Guice frameworksPicocontainer framework也支持此模型) .

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

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

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

    在结合特性的澄清方面也存在差异 . 如果注射组分的选择存在歧义,则应添加 @Named 限定符 . 在类似情况下 @Autowired 将添加注释 @Qualifier 限定符(JSR-330定义它自己的 @Qualifier 注释并通过此限定符注释定义 @Named ) .

  • 144

    假设你在这里指的是javax.inject.Inject注释 . @Inject 是Java EE 6(JSR-299),read more中引入的Java CDI(Contexts and Dependency Injection)标准的一部分 . Spring选择支持使用 @Inject 与他们自己的 @Autowired 注释同义 .

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

  • 12

    这是一个比较 @Resource@Inject@Autowiredblog post,看起来做得非常全面 .

    从链接:

    除测试2和7外,配置和结果完全相同 . 当我看到引擎盖后,我确定'@Autowired'和'@Inject'注释表现相同 . 这两个注释都使用'AutowiredAnnotationBeanPostProcessor'来注入依赖项 . '@Autowired'和'@Inject'可以互换使用来注入Spring bean . 但是'@Resource'注释使用'CommonAnnotationBeanPostProcessor'来注入依赖项 . 尽管它们使用不同的后处理器类,但它们的行为几乎完全相同 . 以下是其执行路径的摘要 .

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

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

  • 9

    为了处理没有布线的情况,可以使用 @Autowired required 属性设置为 false 的bean .

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

  • 616

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

    关于它们有separate section in the Spring documentation,包括与它们的Spring等价物的比较 .

  • 11

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

  • 0

    @Inject 没有'required'属性

相关问题