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是弹簧提供的注释。