Spring框架中的@Inject和@Autowired有什么区别? 在什么情况下使用哪一个?
我正在浏览SpringSource上的一些博客,其中一位博客作者正在使用@Inject ,我想他也可以使用@Autowired
这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不确定@Inject和@Autowired之间的区别,如果有人能解释在什么情况下使用哪个区别以及使用哪个区别,我将不胜感激。
假设您在这里指的是javax.inject.Inject注释。 @Inject是Java EE 6(JSR-299)中引入的Java CDI( 上下文和dependency injection )标准的一部分, 阅读更多信息 。 Spring已经select支持使用@Inject和他们自己的@Autowired注解同义。
所以,回答你的问题,@ @Autowired是Spring自己的(遗留)注释。 @Inject是称为CDI的新Java技术的一部分,它定义了一个类似于Spring的dependency injection标准。 在Spring应用程序中,两个注释的工作方式与Spring决定支持一些JSR-299注释不同。
这是一篇比较@Resource ,@ @Inject和@Autowired的博客文章 ,似乎做了一个非常全面的工作。
从链接:
除了testing2和7,configuration和结果是相同的。 当我查看引擎盖时,我确定“@Autowired”和“@Inject”注释的行为是一致的。 这两个注释都使用“AutowiredAnnotationBeanPostProcessor”来注入依赖关系。 '@Autowired'和'@Inject'可以互换使用来注入Spring bean。 然而'@Resource'注解使用'CommonAnnotationBeanPostProcessor'来注入依赖关系。 即使他们使用不同的后处理器类,它们的performance几乎完全相同。 下面是他们的执行path的总结。
作者引用的testing2和7分别是“按字段名称注入”和“尝试使用错误限定符parsingbean”。
结论应该给你所有你需要的信息。
为了处理没有布线的情况,bean可以使用@Autowired required属性设置为false 。
但是当使用@Inject ,Provider接口和bean一起工作,这意味着这个bean不是直接注入的,而是和Provider一起注入的。
从Spring 3.0开始,Spring支持JSR-330dependency injection注释(@ @Inject ,@ @Named ,@ @Singleton )。
Spring文档中有一个独立的部分 ,包括与Spring等价物的比较。
@Autowired和@Inject之间关键的显着差异(在阅读Spring Docs时注意到)是,@ @Autowired具有“required”属性,而@Inject没有“required”属性。
@Inject没有“必需”属性
@Autowired注解在Spring框架中定义。
@Inject注解是一个标准注释,它在标准的“Java的dependency injection”(JSR-330)中定义 。 Spring(自3.0版本以来)支持在标准JSR-330中定义的dependency injection的广义模型。 ( Google Guice框架和Picocontainer框架也支持这种模式)。
用@Inject可以注入Provider接口的实现的引用,它允许注入延迟引用。
Annotations @Inject和@Autowired – 几乎完全类比。 和@Autowired注解一样,@ @Inject注解可以用于自动绑定属性,方法和构造函数。
与@Autowired注释相比,@ @Inject注释没有required属性。 因此,如果依赖不会被发现 – 将被抛出exception。
在结合性质的澄清方面也有不同。 如果注入组件的select存在歧义,则应添加@Named限定符。 在@Autowired注解的类似情况下,将添加@Qualifier限定符(JSR-330定义它自己的@Qualifier注释并通过此限定符注释@Named被定义)。
除以上内容外:
- @Autowired bean的默认范围是Singleton,而使用JSR 330 @Inject注释就像Spring的
prototype。 - 在JSR 330中使用@Inject没有等价的@Lazy
- @Inject在JSR 330中没有相当于@Value的值
更好地使用@Inject所有的时间。 因为它是javaconfiguration方法(由sun提供),这使得我们的应用程序对框架不可知。 所以,如果你spring也是你的课程将工作。
如果你使用@Autowired它将只能用于Spring,因为@Autowired是弹簧提供的注释。