我正在浏览SpringSource上的一些博客,在其中一个博客中,作者使用的是@Inject,我想他也可以使用@Autowired。
这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不确定@Inject和@Autowired之间的区别,如果有人解释了它们的区别以及在什么情况下使用哪一个,我会很感激的。
- 我没有答案,因为我对这个也很陌生,但这可能有助于sakaenakajima.wordpress.com/2010/08/10/…
- 复制:StActPox.COM/Quasy/13657787/导入自定义Java CLAS和ZWNJ;
- 在本文alexedom.wordpress.com/2016/02/13/&hellip中,我们很好地解释了"@inject"和"@autowired"之间的区别。
假设这里您指的是javax.inject.Inject注释。EDCOX1 1是Java Java 6(JSR-99)中引入的Java CDI(上下文和依赖注入)标准的一部分,请阅读更多内容。Spring选择支持使用@Inject与它们自己的@Autowired注释同义。
所以,为了回答您的问题,@Autowired是Spring自己的(遗留)注释。EDCOX1 1是一种新的Java技术的一部分,称为CDI,它定义了类似于Spring的依赖注入的标准。在一个Spring应用程序中,这两个注释的工作方式与Spring决定支持一些JSR-299注释的方式相同。
- 所以理论上,如果您使用@inject,您可以用另一个DI框架(如guice)替换spring,并以相同的方式注入依赖项。
- 存在学究的风险:@Inject是一个独立的JSR(JSR-330)和CDI(JSR-299)。
- 如果您只依赖JSR-*注释,那么当然,您可以替换DI框架。但你愿意吗?一旦你开始使用Spring,很可能你使用的不仅仅是DI。您不仅会做出改变,而且即使这样做,也不会有几个搜索和替换来完成或破坏移动。另一方面,Spring自己的注释为您提供了更多的功能。掌握一个好的框架会给你带来比很少使用许多框架更多的好处。
- 我同意你的观点,我们不经常更改DI框架。但是,如果我们的源代码有多个包,并且您希望构建一个通用包,您希望在多个项目之间共享该包,然后使用@Injectjsr注释比使用@Autowired更好,后者使用spring di锁定您的代码库。
- 单独使用@Inject并不能确保框架的独立性。您还需要声明没有框架依赖机制的可注入bean,比如Spring的@Component或application.xml,但在类级别上使用@Named和@Singleton。不知道今天是否有任何Spring项目真的像这样声明bean——我甚至从来没有听说过从Spring迁移到Jee的任何项目……
这是一篇比较@Resource、@Inject和@Autowired的博客文章,似乎做得相当全面。
从链接:
With the exception of test 2 & 7 the configuration and outcomes were
identical. When I looked under the hood I determined that the
‘@Autowired’ and ‘@Inject’ annotation behave identically. Both of
these annotations use the ‘AutowiredAnnotationBeanPostProcessor’ to
inject dependencies. ‘@Autowired’ and ‘@Inject’ can be used
interchangeable to inject Spring beans. However the ‘@Resource’
annotation uses the ‘CommonAnnotationBeanPostProcessor’ to inject
dependencies. Even though they use different post processor classes
they all behave nearly identically. Below is a summary of their
execution paths.
作者引用的测试2和7分别是"按字段名注入"和"尝试使用错误的限定符解析bean"。
结论应该给你所需要的所有信息。
- 那篇文章是对这三个注解的一个很好的解释。我在第一次刷卡后不得不重新阅读,但这是一篇很好的文章。
- 谢谢!这篇文章回答了我在寻找斯普林和雅威之间的差异和相似之处时的多次回答,以及我的其他几个问题。
为了处理没有连接的情况,bean可以将@Autowiredrequired属性设置为false。
但是在使用@Inject时,提供程序接口与bean一起工作,这意味着bean不是直接注入的,而是与提供程序一起注入的。
- 这一点非常重要,在最乐观的答案中被忽视了。
- 默认情况下,自动连线的必需参数设置为真。参考:docs.spring.io/spring framework/docs/current/javadoc api/org‌&8203;/…
从Spring3.0开始,Spring提供了对JSR-330依赖注入注释(@Inject、@Named、@Singleton的支持。
在Spring文档中有一个关于它们的单独部分,包括与它们的Spring等价物的比较。
- 这里的问题是,当您说Spring支持JSR时,您的意思是什么?容器是否支持独立于Spring的JSR,以及容器是否符合J2EE的要求?您的意思是它包装了功能吗?如果Spring不"支持"它,那么javax中的注释在默认情况下是否仍然有效?
- 在Jee容器中运行Spring不是必须的,您也可以在像Tomcat这样的servlet/jsp容器中使用它,并且仍然支持JSR-330。Spring是一个独立的DI容器,它不会与主机jee服务器"交换"cdi bean,如果这就是您的意思的话。您可以在jee容器中使用cdi,也可以使用SpringBeans,但不能同时使用这两种(即开箱即用)。
@Autowired和@Inject之间的关键区别(在读取Spring文档时注意到)是,@Autowired具有"必需"属性,@inject没有"必需"属性。
- 你所说的要求是什么意思?
- @mattymanme from the docs,"默认情况下,当零个候选bean可用时,自动布线将失败;默认行为是将带注释的方法、构造函数和字段视为指示所需依赖项。可以通过将所需属性设置为false来更改此行为。例如:@Autowired(required=false),简单来说,"required属性表示自动布线不需要该属性,如果不能自动布线,则忽略该属性。"
- look in to source code public interface autowired/***声明是否需要注释依赖项。*/boolean required()默认为真;公共接口注入
最好一直使用@inject。因为它是Java配置方法(由Sun提供),这使得我们的应用程序对框架不可知。所以,如果你也春天,你的课程将工作。
如果使用@autowired,它将只与spring一起使用,因为@autowired是spring提供的注释。
- 太阳已经死了。太阳万岁。
- 您打算多久更改一次框架?只是好奇
- 在大多数项目中,我看到的是自动连线,而不是注入。我理解答案的基本原理,但我不能投反对票。
@Autowired注释在Spring框架中定义。
EDCOX1 1注释是一个标准注释,它是在标准的"依赖注入Java"(JSR-330)中定义的。Spring(从3.0版开始)支持在标准JSR-330中定义的依赖注入的通用模型。(GoogleGuice框架和Picocontainer框架也支持这个模型)。
使用@Inject可以注入对Provider接口实现的引用,这允许注入延迟的引用。
注释@Inject和@Autowired几乎是完全的类比。除@Autowired批注外,@Inject批注还可用于自动绑定属性、方法和构造函数。
与@Autowired批注不同,@Inject批注没有required属性。因此,如果找不到依赖项-将引发异常。
对结合性质的澄清也存在差异。如果在选择用于注入的组件时存在歧义,则应添加@Named限定符。在类似情况下,@Autowired注释将添加@Qualifier限定符(jsr-330定义它自己的@Qualifier注释,并通过该限定符注释定义@Named)。
- 即使"@注入"不具有Java文档状态所需的属性:需要用"@注入"注解成员的注解。这似乎意味着如果找不到成员,其注入将失败。参见JavaDoc:DOCS.Oracle .COM/JavaEE/7/API/JavaX/JucTe/Icj.HTML
@Inject没有'required'属性
除上述内容外:
@autowired beans的默认范围是singleton,而使用jsr 330@inject注释则类似于Spring的prototype。
在使用@inject的JSR 330中没有等价的@lazy
在使用@inject的JSR 330中没有等价的@value
@Inject注释是JSR-330注释集合之一。它具有按类型匹配、按限定符匹配、按名称匹配执行路径。这些执行路径对setter和field注入都有效,@Autowired注释的行为与@Inject注释相同。唯一的区别是@Autowired注释是Spring框架的一部分。@Autowired注释还具有上述执行路径。因此,我建议您使用@Autowired作为答案。