使用其他模块的spring bean?

时间:2009-11-29 18:43:32

标签: java spring java-ee classloader

我想这很简单 - 但我找不到正确的搜索词组合来得到答案。如果我有一个多模块应用程序,我如何让模块A中的bean可用于模块B中的bean。

项目设置看起来有点像这样:

project.ear/module-a.jar/resources/beans.xml
project.ear/module-a.jar/java/foo/bar.class
project.ear/module-b.war/java/foo/barFactory.class

classespath或文件系统无法访问beans.xml。有没有办法做到这一点?或者我应该做些不同的事情吗?

2 个答案:

答案 0 :(得分:3)

您的appserver可能会为您的EAR中的每个模块使用不同的类加载器,从而阻止一个模块查看另一个模块中的资源。这是JavaEE类加载器的默认行为。

您需要

  • 重新配置您的appserver以在整个EAR中使用“统一”类加载器(这是特定于应用程序服务器的,但如果您可以使其工作,则非常好)或
  • 将所有内容打包到一个模块中(例如,您的WAR可以包含所有内容)或
  • 声明WAR模块的正式清单,允许它声明它对各个JAR模块的依赖关系,这应该允许WAR查看JAR模块中的资源。

答案 1 :(得分:1)

我认为比上面提到的这3个skaffman更容易解决。

  1. 将这些行放入module-b.war / WEB-INF / web.xml:

    <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

    classpath*:/resources/beans.xml

    </param-value>

    </context-param>

    这样就可以从任何类路径(即类路径上的任何jar)加载每个/resources/beans.xml,这对你来说已经足够了。

  2. 您应该将module-a.jar作为module-b.war的一部分加载(module-a.jar位于module-b.war / WEB-INF / lib位置)。

  3. 我的项目中的粒度非常相似:business-logic.jar及其bean的配置和frontend.war,它使用前一个配置的bean通过ref =“someBean”。它有效。