【问题标题】:What is the difference between CDI (Contexts and Dependency Injection) and DI (Dependency Injection)CDI(上下文和依赖注入)和DI(依赖注入)有什么区别
【发布时间】:2017-11-29 10:53:44
【问题描述】:

官方文档说

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

但我还是不明白。 例如 Spring 是 DI,我们仍然可以访问其中的上下文。

【问题讨论】:

  • 请解释更多细节。你想比较 JavaEE 的 DI (JSR 330) 和 CDI(JSR 299) 还是比较 JavaEE 的 CDI 和 Spring 的 DI?

标签: java spring dependency-injection


【解决方案1】:

CDI 为您提供更多机会。并以某种不同的方式提供它,Spring 试图更多地依赖于编译时验证的可能性。但有时它看起来像开销。 例如,在一个非常小的项目中,来自 JSF 的 EJB 加上 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 以及带有 CDI 的 Java EE 6 中。你会发现 javax.inject 包中的 DI 注解。

    最后

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

    【讨论】:

      猜你喜欢
      • 2015-07-15
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2014-12-27
      相关资源
      最近更新 更多