我正试图辨别(某些)CDI和DI之间的区别。
关于@Inject,CDI(JSR-299)带来的只是DI(JSR-330)是什么?
CDI @Injects(就像DI)是真的,但它所注入的生命周期与某些背景/范围有关。如果在使用@Inject时对象存在于对象中,则会获得存在于其中声明的上下文/作用域的实例。如果不存在,则将创建一个新对象。
所以当你想确定你正在获得你注入的对象的正确实例时。即@Inject MyObject myObj;将得到会话范围内的myObject实例(假设我已对其进行注释)
这是对的吗?
答案 0 :(得分:7)
免责声明:我在为Red Hat工作,而且我是CDI合作规范的负责人。所以我对CDI的了解可能比其他DI解决方案更好。这就是说,我会尽力给你一个客观的答案
是的,这是正确的
查看相应的API:
你可以看到CDI比JSR 330更丰富.AtInject规范只定义了1个接口和5个注释,以确保一种通用的方式来声明和解决注入问题。它没有提供有关如何管理组件或关于其生命周期的任何规则。 CDI(实现JSR 330)是一个完整的依赖注入规范,可以将实现与Guice或Spring Core进行比较。
除此之外(事件,可移植扩展,装饰器,拦截器)CDI添加了上下文的概念。正如您所说,它允许您在自己的生命周期中自动管理组件(bean)。您可以在较短的生命周期中注入较长寿命的bean,反之亦然(即在@RequestScoped
bean中注入@ApplicationScoped
bean)。 bean管理器将完成工作以始终为您提供有关活动上下文的正确bean。
CDI还有一个更新版本的JSR 346(CDI 1.1)在9个月前发布了Java EE 7.它增加了一些有关bean生命周期控制的有趣内容。您可以在JBoss Wildlfy 8或Oracle Glassfish 4应用程序服务器中使用它(其他服务器仍在使用其Java EE 7版本)或抓取Weld 2.x并从servlet侦听器或Java SE引导CDI(如果您我更喜欢自己进行整合。
目前我们正在开发1.2版并为CDI 2.0准备JSR提案。
要了解有关CDI的更多信息,我建议您阅读Weld documentation(Weld是CDI参考实现),从用户的角度来看,这是对规范的非常好的介绍。