有关CDI/Weld和DI/Guice中@Inject的信息

joh*_*hnm 4 java dependency-injection guice cdi jboss-weld

我试图辨别(某些)CDI和DI之间的区别.

关于@Inject,CDI(JSR-299)带来的只是DI(JSR-330)是什么?

CDI @Injects(就像DI)是真的,但它所注入的生命周期与某些背景/范围有关.如果使用@Inject时对象存在于作用域中,则会获得存在于其中声明的上下文/作用域的实例.如果不存在,则将创建一个新对象.

所以当你想确定你正在获得你注入的对象的正确实例时.即@Inject MyObject myObj; 将得到会话范围内的myObject实例(假设我已经注释了它)

它是否正确?

Ant*_*and 8

免责声明:我在为Red Hat工作,我是CDI合作规范的领导者.所以我对CDI的了解可能比其他DI解决方案更好.这说,我会尽力给你一个客观的答案

是的,这是正确的

看看各自的API:

您可以看到CDI比JSR 330更丰富.AtInject规范仅定义了1个接口和5个注释,以确保声明和解决注入的常用方法.它没有提供有关如何管理组件或关于其生命周期的任何规则.CDI(实现JSR 330)是一个完整的依赖注入规范,可以将实现与Guice或Spring Core进行比较.

除了其他事物(事件,可移植扩展,装饰器,拦截器)之外,CDI还增加了上下文的概念.正如您所说,它允许您在自己的生命周期中自动管理组件(bean).你可以在较短的生命中注入较长寿命的豆,反之亦然(即@RequestScoped@ApplicationScoped豆中注入豆).bean管理器将完成工作以始终为您提供有关活动上下文的正确bean.

CDI还有一个更新的版本,带有JSR 346(CDI 1.1)9个月前发布的Java EE 7.它增加了一些有关bean生命周期控制的有趣内容.您可以在JBoss Wildlfy 8Oracle Glassfish 4应用程序服务器(其他服务器仍在使用其Java EE 7版本)中使用它,或者如果您更喜欢自己进行集成,请从Servlet侦听器或Java SE中获取Weld 2.x和引导CDI .

现在我们正在开发1.2版并为CDI 2.0准备JSR提案.

要了解有关CDI的更多信息,我建议您阅读Weld文档(Weld是CDI参考实现),从用户的角度来看,这是对规范的非常好的介绍.