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

问题

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

这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不确定如果有人解释了他们之间的区别以及在什么情况下使用哪一个之间的区别,我会不会感谢它们之间的差异.@Inject@Autowired


#1 热门回答(595 赞)

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

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


#2 热门回答(141 赞)

这是ablog post,比较@Resource,@Inject@Autowired,似乎做了一个非常全面的工作。

从链接:

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

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

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


#3 热门回答(26 赞)

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

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