CDI(上下文和依赖注入)与 DI(依赖注入)之间的区别是什么?

4
官方文档说:
The most fundamental services provided by CDI are as follows:
  • 上下文:将有状态组件的生命周期和交互绑定到定义良好但可扩展的生命周期上下文中的能力
  • 依赖注入:以类型安全的方式将组件注入应用程序,包括在部署时选择要注入特定接口的哪个实现的能力

但我仍然不明白它们之间的区别。 例如,Spring 是 DI,我们仍然可以在其中访问上下文。


请解释更多细节。您是想比较JavaEE的DI(JSR 330)和CDI(JSR 299),还是比较JavaEE的CDI和Spring的DI? - Gholamali Irani
2个回答

2
CDI为您提供更多机会,并以一些不同的方式提供它,Spring试图更多地依靠编译时验证的可能性。但有时它看起来像是额外的负担。 在一个非常小的项目中,例如EJB加上JSF的DI就足够了。 但是,您可以使用CDI,只是首先值得仔细阅读与EJB的DI相比的主要优势。有许多小细节,您必须考虑在哪里使用它。
我从 "https://javatalks.ru/topics/40299" 中找到这段话并为您翻译最接近的答案。 我还建议阅读这篇文章: "https://blogs.oracle.com/enterprisetechtips/using-cdi-and-dependency-injection-for-java-in-a-jsf-20-application",这是Oracle工程师关于使用CDI和DI的好文章。

2

阅读Antonio Goncalves的How To Use DI in Java EE 6,让我们有了很好的理解。我将引用其中一个重要部分:

这两个规范是互补的,不能单独使用。

Java依赖注入(又称@Inject)定义了一组注释(@Inject、@Named、@Provider、@Qualifier、@Scope和@Singleton),主要用于注入。如果您下载此JSR(实际上只是Javadoc)并阅读它,您会惊讶地发现没有定义语义(即注入行为在不同实现之间不可移植)。该规范已在Spring 3、Guice以及Java EE 6中使用CDI实现。您将在javax.inject包中找到DI注释。

最后

上下文和依赖注入为JSR 330提供了语义,并添加了更多功能,例如上下文管理、事件、装饰器和增强拦截器(AOP)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接