在多战Spring应用程序中使用共享父应用程序上下文

时间:2014-05-23 07:53:28

标签: java spring

我想在多战Spring应用程序中共享公共应用程序上下文,所以我不需要一次又一次地定义bean。 但我不想在每个webapp 中实例化这个常见应用程序上下文中定义的bean。我只想实例化那些bean并由所有webapps共享。可能吗?我错了。

PS:这个常见的应用程序上下文存在于jar中,我将导入到每个webapps。

1,下面的文章告诉我们如何共享公共应用程序上下文,但需要在每个webapp中实例化这些bean。

How to import spring-config.xml of one project into spring-config.xml of another project?

2,下面是我刚读过的另一篇文章,我演示了它,但仍然没有得到我想要的东西,bean被实例化了两次。有人可以查看此部分“你为什么要使用它?”在文章中,我没有得到它,他们有没有解决方案,有人可以帮助我,非常感谢你的时间。

http://spring.io/blog/2007/06/11/using-a-shared-parent-application-context-in-a-multi-war-spring-application/

这是第二篇文章中的演示源代码:https://github.com/jasonluo/ceciic/tree/master/Research/multiple-contexts-sample

更新

case2的问题是因为我没有部署为ear文件,感谢Deinum指出这一点,我正在使用tomcat,所以没有办法实现它。

我们现在的解决方案是使用REST访问在单独服务器中运行的服务webapp。

2 个答案:

答案 0 :(得分:1)

不要,通常会有类加载器隔离来防止这种情况发生。正确地执行此操作通常需要彻底了解类加载,Java EE,打包和服务器。

如果说有这样的方法可以执行此操作,如您发布的博客中所述。你必须:

  • 将两个WAR打包到EAR中(这意味着您必须使用像WildFly AS这样的appserver,并且不能只使用像Tomcat或Jetty这样的servlet引擎)
  • 将两个WAR打包为“瘦”的WAR,至少包含Spring(及其所有依赖项)以及共享bean(及其所有依赖项)在EAR的lib/文件夹而不是WEB-INF/lib WAR的文件夹。

即使这样,它依赖于服务器的实现细节。 AFAIK不保证在Java EE规范下工作。例如,它可能不适用于GlassFish。

<强>更新

我无法判断您的演示输出是否正确,因为我找不到构建文件。

是的,Tomcat不支持EAR,您可以使用非常相似的Apache TomEE并支持EAR(我不知道TomEE是否以某种方式进行类加载)。从理论上讲,你也可以在Tomcat中使用common classloader,但那将非常糟糕。

答案 1 :(得分:-1)

有一种方法可以使用Spring Dynamic Modules来实现,但它需要OSGi环境,这与简单的Tomcat完全不同。很少有文章值得一读:

话虽如此,关于Spring与OSGi没有太多最新信息,但是值得尝试实现你所说的(当然,还有额外的性能成本)