我正在SpringSource上浏览一些博客,在其中一个博客中,作者正在使用@Inject
,我想他也可以使用@Autowired
。
这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不知道之间的区别@Inject
和@Autowired
,如果有人解释他们的区别将不胜感激,什么情况下要使用哪一个?
我正在SpringSource上浏览一些博客,在其中一个博客中,作者正在使用@Inject
,我想他也可以使用@Autowired
。
这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不知道之间的区别@Inject
和@Autowired
,如果有人解释他们的区别将不胜感激,什么情况下要使用哪一个?
Answers:
假设这里是指javax.inject.Inject
注释。@Inject
是Java EE 6(JSR-299)中引入的Java CDI(上下文和依赖项注入)标准的一部分,更多内容。Spring选择支持@Inject
与自己的@Autowired
注释同义使用。
因此,为回答您的问题,@Autowired
是Spring自己的注释。@Inject
是称为CDI的新Java技术的一部分,该技术定义了类似于Spring的依赖项注入标准。在Spring应用程序中,这两个注释的工作方式与Spring决定除了支持自己的某些JSR-299注释一样。
@Inject
将JSR(JSR-330)与CDI(JSR-299)分开。
@Inject
JSR注释比使用@Autowired
spring DI锁定代码库更好。
@Inject
单独使用将无法确保框架的独立性。您还需要声明可注入bean,而无需使用依赖于框架的机制(例如Spring的@Component
或)application.xml
,而在类级别使用@Named
和@Singleton
。不知道今天是否有任何Spring项目真的声明过这样的豆-我什至从未听说过任何从Spring迁移到JEE的项目...
这是一篇比较@Resource
,@Inject
和的博客文章,@Autowired
似乎做得很全面。
从链接:
除了测试2和7,配置和结果相同。当我深入研究时,我确定'@Autowired'和'@Inject'注释的行为相同。这两个注释都使用'AutowiredAnnotationBeanPostProcessor'注入依赖项。'@Autowired'和'@Inject'可以互换使用来注入Spring bean。但是,“ @ Resource”注释使用“ CommonAnnotationBeanPostProcessor”来注入依赖项。即使它们使用不同的后处理器类,它们的行为也几乎相同。以下是其执行路径的摘要。
作者引用的测试2和7分别是“按字段名注入”和“尝试使用不良限定符解析bean”。
结论将为您提供所需的所有信息。
为了处理没有接线的情况,可以使用@Autowired
required
属性设置为的bean false
。
但是,当使用时@Inject
,Provider接口可与Bean一起使用,这意味着不会直接注入Bean,而是与Provider一起注入。
在Spring 3.0中,Spring提供的JSR-330的依赖注入注解支持(@Inject
,@Named
,@Singleton
)。
关键的区别(阅读时注意春季文档之间)@Autowired
和@Inject
是,@Autowired
有“必要”的属性,而@Inject已经没有“必要”的属性。
@Autowired(required=false)
。简单来说, “该required
属性表示该属性对于自动装配不是必需的,如果该属性不能自动装配,则将其忽略。”
最好一直使用@Inject。因为是java配置方法(由sun提供),这使我们的应用程序与框架无关。因此,如果您还弹奏了您的课程,那么他们将上课。
如果使用@Autowired,它将仅适用于spring,因为@Autowired是spring提供的注释。
@Autowired
注解在Spring框架中定义。
@Inject
注解是标准的注解,在标准的“ Java依赖注入”(JSR-330)中定义。Spring(从3.0版开始)支持标准JSR-330中定义的依赖项注入的通用模型。(Google Guice框架和Picocontainer框架也支持此模型)。
使用with @Inject
可以注入对Provider
接口实现的引用 ,从而可以注入延迟的引用。
注释@Inject
和@Autowired
-几乎是完整的类比。除@Autowired
注释外,@Inject
注释还可用于自动绑定属性,方法和构造函数。
与@Autowired
注释相反,@Inject
注释没有required
属性。因此,如果找不到依赖项,则将引发异常。
结合特性的澄清也有所不同。如果在进样的成分选择上存在歧义,@Named
应添加限定词。在类似的情况下,将为@Autowired
注释添加@Qualifier
限定符(JSR-330定义了它自己的@Qualifier
注释,并通过此限定符@Named
定义了注释)。
@Inject
没有“必填”属性
除了上述内容:
@Autowired
bean 的默认范围是Singleton,而使用JSR 330 @Inject
注释则类似于Spring的prototype。@Inject
。@Inject
。