spring - CDI 是 Spring 的一个很好的替代品吗?

标签 spring java-ee-6 cdi

我们计划从头开始编写一个 Web 应用程序,已决定使用符合 Java EE 6 标准的最新版 Glassfish,因此我们正在分析是否可以使用 CDI 来代替 Spring。

我们可以说 CDI 可以替代 Spring 吗?

最佳答案

2021 年更新:我回答最初的问题已经 10 年了,但我仍然偶尔获得支持。我能否请 future 的读者接受我的回答:2011 年 Java 企业版图的反射(reflect)。

CDI 代表“上下文和依赖注入(inject)”,而 Spring 是一个围绕依赖注入(inject)容器的完整生态系统。要比较两者,您必须区分比较。

依赖注入(inject)由两个容器处理。主要区别在于 CDI 以 动态(又名:有状态)方式处理 DI - 这意味着在执行时解决依赖关系。 Spring 的方法是静态 - 这意味着组件在创建时 连接在一起。虽然 CDI 方式乍一看可能有点不寻常,但它要优越得多,并提供更多和高级的选项(我写这篇文章的背景是两个高效的 CDI 应用程序)。

如果您查看 生态系统,情况就不同了:Spring 捆绑了 很多 jar (>150),而 CDI 本身非常小。典型的 CDI 用法是在 Java EE 6 应用服务器内部,但您可以轻松地使其在 servlet 引擎甚至 Java SE 中工作。这意味着使用 CDI 不会假设使用 Hibernate、JPA、EJB 或其他任何东西 - 这取决于您。

如果您需要更多功能,CDI 带有 可移植扩展 的概念(这本身就使 API 有值(value))。存在独立的扩展模块,如 Apache CODI 和 Seam 3,涵盖安全、邮件、报告等主题。

总结一下:CDI 并不是 Spring 生态系统的“替代品”,而是对 Spring 的依赖注入(inject)机制的改进。它是 Java EE 6 的一部分,因此如果您使用 Java EE 6 的 GlasFish,那么您绝对应该选择 CDI。在我看来,您的问题是:我可以用 Java EE 6 替换 Spring 吗?我想我的答案很明显;-)

看看Weld有个好的开始...

关于spring - CDI 是 Spring 的一个很好的替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973364/

相关文章:

java - 如何确定注入(inject)的CDI bean的parameterizedType的具体类型

java - Spring Webflux : Webclient : Get body on error

java - 如何将 `java.nio.file.Path` 中的反斜杠 (\) 替换为正斜杠 (/)?

hibernate - "could not initialize proxy - no session"有可用的开放 session

jsf - Websphere 上的 javax.enterprise.inject.UnsatisfiedResolutionException

java - 当您不确定单元名称时如何创建 EntityManager?

spring - 如何为 Spring Boot/MVC 资源设置可识别的内容/MIME 类型?

java - spring boot编译找不到符号componentscan

java - 在 Eclipse 中将 Java Web 应用程序部署到 glassfish 的根上下文?

javamail 将图像添加到 html 电子邮件中。如何?