Java 在multi-war Spring应用程序中使用共享父应用程序上下文

Java 在multi-war Spring应用程序中使用共享父应用程序上下文,java,spring,Java,Spring,我想在一个multi-war Spring应用程序中共享公共应用程序上下文,所以我不需要一次又一次地定义bean但我不想在每个webapp中实例化在这个公共应用程序上下文中定义的bean。我只想实例化这些bean一次,并由所有webapps共享。可能吗?如果我错了,就揭发我吧 这个公共应用程序上下文存在于jar中,我将把它导入到每个webapps中 下面的文章告诉我们如何共享公共应用程序上下文,但需要在每个webapp中实例化这些bean 下面是我刚刚读的另一篇文章,我演示了它,但仍然没有得到

我想在一个multi-war Spring应用程序中共享公共应用程序上下文,所以我不需要一次又一次地定义bean但我不想在每个webapp中实例化在这个公共应用程序上下文中定义的bean。我只想实例化这些bean一次,并由所有webapps共享。可能吗?如果我错了,就揭发我吧

这个公共应用程序上下文存在于jar中,我将把它导入到每个webapps中

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

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

以下是第二篇文章中的演示源代码:

更新

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


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

不要这样做,通常会有类加载器隔离来防止这种情况发生。要做到这一点,通常需要彻底了解类加载、JavaEE、打包和服务器

话虽如此,还是有办法做到这一点,正如你在博客上所描述的那样。你必须:

  • 将这两个WAR打包到EAR中(这意味着您必须像WildFly那样使用和appserver,而不能仅仅使用像Tomcat或Jetty这样的servlet引擎)
  • 在EAR的
    lib/
    文件夹中,而不是WAR的
    WEB-INF/lib
    文件夹中,将两个WAR打包为至少包含Spring(及其所有依赖项)和共享bean(及其所有依赖项)的“瘦”WAR
即使如此,这也取决于服务器的实现细节。AFAIK不能保证在JavaEE规范下工作。例如,它可能在玻璃鱼身上不起作用

更新

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


是的,Tomcat不支持EAR,您可以使用它,它非常类似于EAR,并且支持EAR(我不知道TomEE是否以某种方式进行类加载,从而使其工作)。从理论上讲,您也可以在Tomcat中使用,但这将是一个相当大的难题。

有一种方法可以做到这一点,使用,但它需要OSGi环境,这与简单的Tomcat非常不同。很少有文章值得一读:


也就是说,关于OSGi的Spring没有太多的最新信息,但是值得一试,以实现您所说的(当然,还有额外的性能成本)

如果Bean被多次实例化,那么您的设置中就会出现错误。博客提供了正确的解决方案。以下是我的输出:
Hello来自SampleWeb1,使用服务实例com.interface21.sample.multiplecontexts.service。SampleServiceImpl@753f67a9来自SampleWeb1的Hello,使用服务实例com.interface21.sample.multiplecontexts.service。SampleServiceImpl@39654982
。它向我展示了不同的实例。您是否创建并部署了ear?或者你只是把两场战争分开部署。只有将所有内容打包到ear文件中,它才会起作用。嗨,Deinum,我确实单独部署了两个WAR,感谢您指出,这将创建一个ear并尝试。我会回来找你的。嗨,马歇尔,谢谢你的回复。这是否意味着我的演示具有正确的输出,博客只是做了与第一篇文章相同的事情,对吗?我使用的是tomcat,看起来这是一个不可能完成的任务,因为tomcat不支持EAR文件,只支持war文件。您必须使用支持EAR文件的服务器,如TomEE、GlassFish或JBoss。它只能在EAR文件中工作,或者在根/公共类加载器中使用很多技巧,但这是您不希望采用的路径。它已被捐赠给日食基金会,现在是月食处女座。