我正在使用使用Spring进行DI/Bean管理的非常大的JSF/FACELETS应用程序。我的应用程序具有模块化结构,目前我正在寻找标准化模块化的方法。

我的目标是从许多模块(可能相互取决于)中撰写Web应用程序。每个模块可能包含以下内容:

  • 班级;
  • 静态资源(图像,CSS,脚本);
  • 面部模板;
  • 托管bean-带有请求,会话和应用程序的bean的春季应用程序上下文(替代性是JSF托管bean);
  • servlet api东西 - servlet,滤镜,听众(这是可选的)。

我想避免的(几乎不惜一切代价)是需要复制或提取模块资源(例如facelets模板)或扩展 web.xml 对于模块的servlet,过滤器等WEB-INF/lib, bundles, plugins, ,...)使用此模块扩展Web应用程序。

目前,我使用自定义模块化解决方案来解决此任务,该解决方案大量基于使用ClassPath资源:

  • 特殊资源Servlet提供来自类Path Resources(JARS)的静态资源。
  • 特殊Facelets资源解析器允许从类路径资源加载面部模板。
  • 春季通过模式加载应用程序上下文 classpath*:com/acme/foo/module/applicationContext.xml - 这加载了模块罐中定义的应用程序上下文。
  • 最后,一对委派的servlet和过滤器委派请求处理委员会在弹簧应用程序上下文中从模块中配置的servlet和过滤器。

最后几天,我阅读了很多有关OSGI的信息,我正在考虑,如果以及是否可以将OSGI用作标准化的模块化方法。我正在考虑如何使用OSGI解决个别任务:

  • 静态资源 - 想要导出静态资源注册的OSGI捆绑包 ResourceLoader 捆绑上下文的实例。中央 ResourceServlet 使用这些资源加载程序从捆绑包中加载资源。
  • facelet模板 - 类似于上面的中央 ResourceResolver 使用捆绑包注册的服务。
  • 托管豆 - 我不知道 如何使用像 #{myBean.property} 如果 myBean 在其中一个捆绑中定义。
  • Servlet API东西 - 使用webextender/pax Web之类的东西注册servlet,过滤器等。

我的问题是:

  • 我在这里发明自行车吗?有标准解决方案吗?我发现了春季切片的提及,但找不到太多的文档。
  • 您认为OSGI是适合描述任务的正确技术吗?
  • 我对OSGI应用程序的草图或多或少正确?
  • 如何处理托管豆(尤其是请求/会话范围)?

我通常会感谢您的评论。

有帮助吗?

解决方案

您的目标听起来很可行,并有一些警告:

视图层: 首先,您的视图层听起来有些过分。还有其他方法可以通过使用自定义组件来模块化JSF组件,从而避免尝试创建像后期托管豆一样戏剧性的事物所涉及的头痛。

模块本身: 其次,您的模块似乎并不是特别模块化。您的第一个子弹列表使它听起来好像您正在尝试创建可互操作的Web应用程序,而不是本身。我对模块的想法是,每个组件具有明确的,或多或少的离散目的。喜欢如何 前任 基础 vi. 。如果您要沿着OSGI路线走,那么我们应该像这样定义模块化: 为了讨论,模块化意味着组件是可热的,也就是说,可以添加它们 并删除 没有破坏应用程序。

依赖性: 我对您对模块的描述为“可能相互取决于”。您可能(我希望)已经知道这一点,但是您的依赖性应该形成有向的无环图。一旦引入了循环依赖,您就会要求应用程序的最终可维护性而受到伤害。 OSGI最大的弱点之一是 防止循环依赖性,因此要执行此功能。否则,您的依赖性将像kudzu一样成长,并逐渐扼杀系统的其余生态系统。

servlets: fuhgeddaboudit。您不能直到Servlet 3.0规格正在生产中(如Pascal指出),您才能将其滞后servlets。要启动单独的实用程序,您需要将其放入自己的应用程序中。


好的,要注意的是很多。让我们考虑一下可能如何工作:

您已将自己的JSF模块定义为……到底是什么?让我们给它一个定义的,相当微不足道的目的:登录屏幕。因此,您可以创建登录屏幕,然后将其使用OSGI加入您的应用程序,然后...那呢?如果您尚未在.jspx页面中定义它,该应用如何知道登录功能在那里?该应用如何导航到那里不知道的东西?

有条件包含的方法有多种方法可以解决此问题(例如, <c:if #{loginBean.notEmpty}>),但是,就像您说的那样,当您的托管登录键存在于另一个可能还没有介绍给应用程序的模块中时,事情会有些毛茸茸。实际上,除非存在该登录方式,否则您将获得servlet例外。所以你会怎么做?

您在一个模块中定义API。 您打算在模块之间共享的所有托管bean都必须在此API层中指定为接口。而且您所有的模块都必须具有他们打算使用的任何这些接口的默认实现。并且必须在所有可互操作模块之间共享此API。然后,您可以使用OSGI和Spring将指定的豆与它们的实现联系在一起。

我需要花点时间指出,这不是我要解决这个问题的方式。一点也不。给定像登录页面一样简单,甚至像库存图表一样复杂,我个人更喜欢创建自定义JSF组件。但是,如果要求是“我希望我的托管豆是模块化的(即,热盘等),这是我知道使其正常工作的唯一方法。而且我什至不确定 将要 工作。 此电子邮件交换 这表明这是JSF开发人员刚刚开始努力的问题。

我通常认为托管豆是视图层的一部分,因此,我仅将它们用于视图逻辑,并将其他所有内容委派给服务层。在我看来,制作托管豆的后期结合是将它们从视图层中推广到业务逻辑中。所有这些教程都如此专注于服务是有原因的:因为大多数时候您想考虑应用程序运行“无头”所需的内容,以及“皮肤”您的观点的容易实例,您希望它能在Android手机上运行所有功能。

但这听起来像是您正在使用的很多内容本身就是查看逻辑 - 例如,需要在其他视图模板中交换。 OSGI/Spring应该能够提供帮助,但是您将需要应用程序中的某些内容才能在可用的实现之间进行选择:OSGI的服务注册表几乎要构建了要做的事情。

留下静态资源。您可以对这些模块化,但是请记住,您需要定义一个接口来检索这些资源,并且需要提供默认实现,以便如果不存在应用程序,则不会扼杀它们。如果I18N是一个考虑因素,那么这可能是一个好方法。如果你想成为 真的 冒险,然后您可以将静态资源推入JNDI。这将使它们完全可热门,并为您节省尝试解决哪些实现的痛苦,但是有一些缺点:任何失败的查找都会导致您的应用程序抛出NamingException。而且这太过杀了。 JNDI通常在Web应用中用于应用程序配置。

至于您剩下的问题:

我在这里发明自行车吗?有标准解决方案吗?

你有点。我已经看到了这样做的应用程序 种类 事情,但是您似乎偶然发现了一系列相当独特的要求。

您认为OSGI是适合描述任务的正确技术吗?

如果您需要模块可进行热盘,那么您的选择是OSGI和较轻的权重服务器接口。

我对OSGI应用程序的草图或多或少正确?

我不能真正知道您的组件边界在哪里。目前,听起来您可能正在推动Osgi做更多的事情。

但是不要相信我的话。 成立 其他 在这些地方读取材料。

而且由于您询问春季片, 这应该足以让您开始. 。您将需要一个git客户端,看起来您将通过查看源代码来培训应用程序。这是非常早期的原型代码。

其他提示

我在当前项目中面临着同样的问题。在我看来,就标准和未来的支持而言,OSGI是最好,最干净的解决方案,但是如果您尝试在Web应用程序中使用它,目前您可能会遇到一些问题:

  1. Web容器和OSGI平台之间尚无整合的解决方案。
  2. OSGI对于仅搜索简单的模块化体系结构的自定义构建Web应用程序可能太多了。如果我的项目需要支持未受我们控制的第三方扩展,如果项目需要热门部门,插件之间的严格访问规则,我会考虑OSGI。

基于类加载程序和资源过滤器的自定义解决方案似乎非常适合我。例如,您可以研究 哈德森源代码 或Java插件框架(JPF)项目(http://jpf.sourceforge.net/)。

与扩展Web.xml一样,我们可能很幸运使用Servlet 3.0规范(http://today.java.net/pub/a/today/2008/2008/10/10/14/introduction-tocult-to-servlet-3.html#可插拔性和扩展性)。

由“ Web模块部署描述符片段”(又称Web-fragment.xml) Servlet 3.0规格 这里会很好。该规范将其定义为:

Web片段是Web应用程序的逻辑分区,以使Web应用程序中使用的框架可以定义所有工件,而无需要求Devlopers在Web.xml中编辑或添加信息。

Java EE 6现在可能不是您的选择。尽管如此,它还是标准化的解决方案。

企业OSGI是一个相当新的领域,因此不要认为您会得到直接满足您需求的解决方案。就是说,我发现Equinox缺少的一件事(Eclipse后面的OSGI引擎,因此用户群最大!)是一致的配置 / DI服务。在我最近的项目中,我们有一些类似的需求,并结束了一个简单的配置OSGI服务。

模块化应用程序固有的问题之一是在DI附近,因为模块可见性可以在某些情况下阻止类访问。我们使用注册的策略解决了这一点,这不是太理想,而是有效的。

除了配置外,您还可以查看最近发布的Equinox书,以获取有关使用OSGI作为创建模块化应用程序的基础的指导。这些示例可能是特定于Equinox的,但是原理将与任何OSGI框架一起使用。关联 - http://equinoxosgi.org/

您应该查看Spring DM服务器(已过渡到Eclipse处女座,但尚未发布)。在最近的OSGI Enterprise Spec中,也有很多好处,也刚刚发布。

我想,一些春季DM教程将有所帮助。但是,是的,可以使用标准模块化从Web捆绑包中加载资源和类。这是一个很好的选择。

至于会话上下文 - 它可以按照您的期望进行处理。但是,您可能会遇到在网络捆绑包之间共享该会话的问题,以至于不确定是否有可能。

您还可以希望拥有一个Web捆绑包,然后使用Eg Eclipse扩展注册表来扩展您的Web应用程序的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top