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

pra*_*see 67 spring cdi java-ee-6

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

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

jan*_*oth 93

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

依赖注入由两个容器处理.主要区别在于CDI以动态(又称:有状态)方式处理DI - 这意味着在执行时解析依赖关系.Spring的方法是静态的 - 这意味着组件在创建时连接在一起.虽然CDI方式在第一眼就看起来有点不同寻常,但它的优势远远超出了它并提供了更多更高级的选择(我正在以两个高效的CDI应用程序为背景来编写).

如果你看一下生态系统,情况会有所不同:Spring捆绑了很多罐子(> 150),而CDI本身就很小.典型的CDI用法将在Java EE 6应用程序服务器内部,但您可以轻松地使其在servlet引擎甚至Java SE中运行.这意味着使用CDI不会假设使用Hibernate,JPA,EJB或其他任何东西 - 这取决于您.

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

总结一下:CDI与Spring生态系统的"替代"完全不同,它相当于对Spring的依赖注入机制的改进.它是Java EE 6的一部分,所以如果您使用的是带有Java EE 6的GlasFish,那么您一定要选择CDI.在我看来,你的问题是:我可以用Java EE 6替换Spring吗?我猜我的答案非常明显;-)

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

  • 不,这不正确 - 我没有按照动态注射的定义.CDI的动态部分是代理依赖关系(作为您的写入),并且代理将在请求时注意解决正确的依赖关系(因此可以将两个依赖关系的两次调用转发到该依赖关系的两个不同实例).但也许评论不是开始讨论的正确场所,你可能想为此开一个新问题...... (9认同)
  • 春天的方法是静态的。我不认为这是完全准确的(至少目前是这样)。Spring还提供了其他作用域(例如“原型”作用域),该作用域在执行请求期间在运行时解析bean和连接。 (2认同)

Lam*_*bda 10

Spring不仅仅是一个依赖注入容器.它还具有AOP工具,用于JPA,SQL等的模板甚至更多.

但是,CDI可以用作Spring的DI API的替代品.

  • 我认为CDI通过拦截器处理AOP (5认同)
  • 您可以编写扩展,根据您的规则向bean添加拦截器.这很容易.对于大多数应用来说,AOP的广泛使用过于复杂而无法使用. (3认同)