一段时间以来,我一直在开发 Spring 3 + JSF 2.0 应用程序。它们在简单的 Tomcat 或 Jetty 容器上运行。看着广告 CDI,我很羡慕对话范围。
你知道 Spring 的简单对话范围实现吗?我不想使用成熟的 SpringMVC + WebFlow + SpringFaces 堆栈。我只需要一个启用对话范围并让我注入对话对象并启动或停止它的 Web 过滤器。就像在 CDI 中一样。
不完全是您的问题,但由于您要求解决方案以避免使用 Spring Webflow、Spring Faces 等……看起来您只是将 Spring 用于 DI(我的意思是您并不那么依赖在 Spring 生态系统上)。好吧,也许在这种情况下,考虑迁移到 Java EE 6 堆栈是值得的。我认为迁移不会那么困难,因为您使用的 Spring 并不多,而且如果您在 spring 中有仍然需要的 bean,您可以为它们编写一些 CDI 生产者。您可以搜索一些从 Spring 到 Java EE 6 的迁移路径。
如果你害怕“沉重的 Java EE 容器”,那么 jboss 7.1、Glassfish 3.1.2 和 TomEE 都可以在 2 秒内在我的笔记本上启动,我敢打赌你的 tomcat + spring 容器不会启动得更快。
只是我的观点。
你应该看看 Apache TomEE + CODI 项目(Apache MyFaces 的主题)和/或 Apache Deltaspike(不确定文档是最新的,因为它还很年轻)
TomEE 为您提供了 CDI 的优势,CODI 在 cdi 和 jsf 之间添加了一个小型集成层,使其非常强大(它将集成到 deltaspike 中,但仍在进行中)
MyFaces Orchestra(也与 Mojarra 一起使用)是目前 JSF 2.0 在 Spring 之上的最佳对话范围实现。
在托管 bean 上使用 JSF@ViewScoped
注释,它为您提供与 CDI 对话范围相同的类似对话的语义。CDI 的对话范围和 JSF 的视图范围之间的一个区别是,CDI 为您提供了对对话的明确和直接的控制,而 JSF 视图范围几乎可以使用。但是使用 JSF 的 ViewScope,您可以准确地知道对话的边界在哪里:当您加载一个由@ViewScoped
bean 支持的页面时,对话开始,并在页面关闭时结束。这对于许多用例都很方便
Primefaces 的 Cagatay 也有这个 hack来模拟 Spring 中的 CDI 范围。
Richfaces 团队的 Max Katz 的本教程也很好地介绍了 JSF ViewScope