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