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

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

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

CDI代表“上下文和dependency injection”,而Spring是dependency injection容器的完整生态系统。 为了比较两者,你必须区分比较。

dependency injection由两个容器处理。 主要区别在于CDI以dynamic (又名:有状态)方式处理DI,这意味着依赖关系在执行时被parsing。 Spring的方法是静态的 – 这意味着组件在创build时连线在一起。 虽然CDI的方式看起来有点不同寻常,但是它的优越性并且提供了更多更高级的select(我正在用两个高效的CDI应用程序的背景来编写这个选项)。

如果你看一下生态系统 ,情况就不一样了:Spring捆绑了很多jar子(> 150),而CDI本身就很小。 一个典型的CDI用法将在Java EE 6应用程序服务器内部,但是您可以轻松地使它在一个servlet引擎甚至Java SE中工作。 这意味着使用CDI不会假设使用Hibernate,JPA,EJB或其他什么 – 这取决于你。

如果你需要更多的function,CDI带有可移植扩展的概念(这本身使得API变得可行)。 像Apache CODI和Seam 3这样的独立扩展模块已经存在,涵盖了诸如安全,邮件,报告等等。

总结一下:CDI不像是Spring生态系统的“替代品”,相对于Spring的dependency injection机制来说是一个改进。 它是Java EE 6的一部分,所以如果你使用的是Java EE 6的GlasFish,你一定要去CDI。 在我看来,你的问题是:我可以用Java EE 6取代Spring吗? 我猜我的回答很明显;-)

看看Weld获得一个好的开始…

Spring不仅仅是一个dependency injection容器。 它还有AOP工具,用于JPA,SQL等的模板,甚至更多。

但是CDI可以用来替代Spring的DI API。

我使用Apache OpenWebBeans作为CDI实现和MyFaces CODI作为几个项目的可移植扩展。 我对此非常满意,并且没有任何问题。 OpenWebBeans目前在文档方面还有一些缺陷,但是如果你不能find工作的话,使用MyFaces提供的Maven Archetypes生成所有需要的依赖关系的简单项目或者在邮件列表上询问是非常容易的。 如果你只是在你的应用程序上工作,并且你没有被恶意程序所阻挡,那么这是非常棒的。 我也和Spring做了很多项目。 没关系,但如果你问我将用于下一个项目,清楚的答案是OpenWebBeans和CODI! 我更喜欢OpenWebBeans而不是Weld,因为OpenWebBeans非常适合,因为你可以自定义更多或更less的东西,而官方的CDI API / SPI并没有涵盖,运行时性能更好。 在第一个项目之后,我再也不会质疑CODI,因为它非常稳定,它们定期发布,其中大部分都带来了很多新的特性,这些特性提高了生产力。 CODI是恕我直言的最稳定的地方,大部分创新都来自整个CDI的土地。

回答你的问题:对我来说,CDI完全取代了Spring,但是你需要可移植的扩展来填补空白。 作为标准的CDI从来没有打算解决所有的问题,一些像对话这样的部分被devise破坏了。 好消息是你有很棒的项目,比如MyFaces CODI。 CODI修复了几乎所有这些问题。