我正在浏览一些关于SpringSource的博客,在其中一个博客中,作者正在使用 @Inject ,我想他也可以使用 @Autowired .
@Inject
@Autowired
这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不确定 @Inject 和 @Autowired 之间的区别,如果有人解释了他们的区别以及在什么情况下使用哪一个,我会很感激?
最好一直使用@Inject . 因为它是java配置方法(由sun提供),它使我们的应用程序与框架无关 . 所以,如果你 Spring 天,你的课程也会奏效 .
如果你使用@Autowired它只适用于spring,因为@Autowired是spring提供的注释 .
除上述内容外:
@Autowired bean的默认范围是Singleton,而使用JSR 330 @Inject注释它就像Spring的 prototype .
prototype
使用@Inject在JSR 330中没有@Lazy的等价物
使用@Inject在JSR 330中没有等效的@Value
@Autowired 和 @Inject 之间的关键区别(在阅读Spring Docs时注意到)是, @Autowired 具有'required'属性,而@Inject没有'required'属性 .
@Autowired 注释在Spring框架中定义 .
@Inject annotation是标准注释,在标准"Dependency Injection for Java" (JSR-330)中定义 . Spring(自版本3.0起)支持依赖注入的通用模型,该模型在标准JSR-330中定义 . (Google Guice frameworks和Picocontainer framework也支持此模型) .
用 @Inject 可以注入 Provider 接口的实现引用,这允许注入延迟引用 .
Provider
注释 @Inject 和 @Autowired - 几乎是完全类比 . 除 @Autowired 注释外, @Inject 注释还可用于自动绑定属性,方法和构造函数 .
与 @Autowired 注释相反, @Inject 注释没有 required 属性 . 因此,如果找不到依赖项 - 将抛出异常 .
required
在结合特性的澄清方面也存在差异 . 如果注射组分的选择存在歧义,则应添加 @Named 限定符 . 在类似情况下 @Autowired 将添加注释 @Qualifier 限定符(JSR-330定义它自己的 @Qualifier 注释并通过此限定符注释定义 @Named ) .
@Named
@Qualifier
假设你在这里指的是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注释相同 .
这是一个比较 @Resource , @Inject 和 @Autowired 的blog post,看起来做得非常全面 .
@Resource
从链接:
除测试2和7外,配置和结果完全相同 . 当我看到引擎盖后,我确定'@Autowired'和'@Inject'注释表现相同 . 这两个注释都使用'AutowiredAnnotationBeanPostProcessor'来注入依赖项 . '@Autowired'和'@Inject'可以互换使用来注入Spring bean . 但是'@Resource'注释使用'CommonAnnotationBeanPostProcessor'来注入依赖项 . 尽管它们使用不同的后处理器类,但它们的行为几乎完全相同 . 以下是其执行路径的摘要 .
作者引用的测试2和7分别是“按字段名称注入”和“尝试使用错误限定符解析bean” .
结论应该为您提供所需的所有信息 .
为了处理没有布线的情况,可以使用 @Autowired required 属性设置为 false 的bean .
false
但是当使用 @Inject 时,Provider接口与bean一起工作,这意味着bean不是直接注入,而是使用Provider .
从Spring 3.0开始,Spring提供了对JSR-330依赖注入注释的支持( @Inject , @Named , @Singleton ) .
@Singleton
关于它们有separate section in the Spring documentation,包括与它们的Spring等价物的比较 .
@Inject 注释是JSR-330注释集合之一 . 这具有按类型匹配,按限定符匹配,按名称匹配执行路径 . 这些执行路径对setter和field injection都有效. @Autowired 注释的行为与 @Inject 注释相同 . 唯一的区别是 @Autowired 注释是Spring的一部分框架 . @Autowired 注释也具有上述执行路径 . 所以我推荐 @Autowired 作为你的答案 .
@Inject 没有'required'属性
10 回答
最好一直使用@Inject . 因为它是java配置方法(由sun提供),它使我们的应用程序与框架无关 . 所以,如果你 Spring 天,你的课程也会奏效 .
如果你使用@Autowired它只适用于spring,因为@Autowired是spring提供的注释 .
除上述内容外:
@Autowired bean的默认范围是Singleton,而使用JSR 330 @Inject注释它就像Spring的
prototype
.使用@Inject在JSR 330中没有@Lazy的等价物
使用@Inject在JSR 330中没有等效的@Value
@Autowired
和@Inject
之间的关键区别(在阅读Spring Docs时注意到)是,@Autowired
具有'required'属性,而@Inject没有'required'属性 .@Autowired
注释在Spring框架中定义 .@Inject
annotation是标准注释,在标准"Dependency Injection for Java" (JSR-330)中定义 . Spring(自版本3.0起)支持依赖注入的通用模型,该模型在标准JSR-330中定义 . (Google Guice frameworks和Picocontainer framework也支持此模型) .用
@Inject
可以注入Provider
接口的实现引用,这允许注入延迟引用 .注释
@Inject
和@Autowired
- 几乎是完全类比 . 除@Autowired
注释外,@Inject
注释还可用于自动绑定属性,方法和构造函数 .与
@Autowired
注释相反,@Inject
注释没有required
属性 . 因此,如果找不到依赖项 - 将抛出异常 .在结合特性的澄清方面也存在差异 . 如果注射组分的选择存在歧义,则应添加
@Named
限定符 . 在类似情况下@Autowired
将添加注释@Qualifier
限定符(JSR-330定义它自己的@Qualifier
注释并通过此限定符注释定义@Named
) .假设你在这里指的是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注释相同 .这是一个比较
@Resource
,@Inject
和@Autowired
的blog post,看起来做得非常全面 .从链接:
作者引用的测试2和7分别是“按字段名称注入”和“尝试使用错误限定符解析bean” .
结论应该为您提供所需的所有信息 .
为了处理没有布线的情况,可以使用
@Autowired
required
属性设置为false
的bean .但是当使用
@Inject
时,Provider接口与bean一起工作,这意味着bean不是直接注入,而是使用Provider .从Spring 3.0开始,Spring提供了对JSR-330依赖注入注释的支持(
@Inject
,@Named
,@Singleton
) .关于它们有separate section in the Spring documentation,包括与它们的Spring等价物的比较 .
@Inject
注释是JSR-330注释集合之一 . 这具有按类型匹配,按限定符匹配,按名称匹配执行路径 . 这些执行路径对setter和field injection都有效.@Autowired
注释的行为与@Inject
注释相同 . 唯一的区别是@Autowired
注释是Spring的一部分框架 .@Autowired
注释也具有上述执行路径 . 所以我推荐@Autowired
作为你的答案 .@Inject
没有'required'属性