我正在处理使用 Spring 进行 DI/bean 管理的非常大的 JSF/Facelets 应用程序。我的应用程序具有模块化结构,我目前正在寻找标准化模块化的方法。
我的目标是从多个模块(可能相互依赖)组成一个 Web 应用程序。每个模块可能包含以下内容:
- 课程;
- 静态资源(图片、CSS、脚本);
- 小面模板;
- 托管 bean - Spring 应用程序上下文,具有请求、会话和应用程序范围的 bean(替代方案是 JSF 托管 bean);
- Servlet API 的东西 - servlet、过滤器、侦听器(这是可选的)。
我想避免(几乎不惜一切代价)需要将模块资源(如 Facelets 模板)复制或提取到 WAR 或扩展web.xml
for 模块的 servlet、过滤器等。添加模块必须足够(JAR, bundle, artifact, ...) 到 Web 应用程序 ( WEB-INF/lib
, bundles
, plugins
, ...) 以使用此模块扩展 Web 应用程序。
目前,我使用自定义模块化解决方案来解决此任务,该解决方案很大程度上基于使用类路径资源:
- 特殊资源 servlet 提供来自类路径资源 (JAR) 的静态资源。
- 特殊的 Facelets 资源解析器允许从类路径资源加载 Facelet 模板。
- Spring 通过模式
classpath*:com/acme/foo/module/applicationContext.xml
加载应用程序上下文 - 这会加载模块 JAR 中定义的应用程序上下文。 - 最后,一对委托 servlet 和过滤器将请求处理委托给模块中在 Spring 应用程序上下文中配置的 servlet 和过滤器。
前几天我读了很多关于 OSGi 的文章,我正在考虑如何(以及是否)可以将 OSGi 用作标准化的模块化方法。我在考虑如何使用 OSGi 解决单个任务:
- 静态资源 - 想要导出静态资源的 OSGi 包
ResourceLoader
在包上下文中注册一个实例。中央ResourceServlet
使用这些资源加载器从包中加载资源。 - Facelet 模板 - 与上面类似,中心
ResourceResolver
使用捆绑注册的服务。 - 托管 bean -我不知道如何使用
#{myBean.property}
ifmyBean
在其中一个包中定义的表达式。 - Servlet API 的东西 - 使用 WebExtender/Pax Web 之类的东西来注册 servlet、过滤器等。
我的问题是:
- 我在这里发明自行车吗?有没有标准的解决方案?我发现提到了 Spring Slices,但找不到太多关于它的文档。
- 您认为 OSGi 是完成所描述任务的正确技术吗?
- 我的 OSGI 应用程序草图或多或少正确吗?
- 应如何处理托管 bean(尤其是请求/会话范围)?
我一般会感谢您的评论。