我有一个依赖于其他两个模块的web应用程序。
为简单起见,我们称它们为ServiceA
模块和ServiceB
模块。
这些模块中的每一个都有各种不同的依赖关系,并且对Entities
模块也有一个共同的依赖关系。上面提到的每个模块都声明了自己的spring上下文文件,其中包含与它的作用域相关的信息。我现在正试图决定如何在项目之间"连接"这些配置文件,我有点难倒了。
我知道一个选项是只是声明所有的"结束"文件(即ServiceA, ServiceB和实体)在web应用程序的web.xml(在contextConfigLocation
参数),但我不喜欢这个选项,特别是因为我的实际用例是更复杂的,有更多的内部依赖关系共享。
我最初的意图是在contextConfigLocation
参数中声明ServiceA
和ServiceB
的配置文件,因为这些是web应用程序直接依赖的唯一项目(这很容易通过查看maven pom看到),然后有ServiceA
和ServiceB
在其spring上下文配置文件<import resource="classpath:EntitiesContext.xml">
中包含此指令。这种方法的优点是它与maven传递方法是一致的,在maven传递方法中,我声明我依赖的是什么,如果该模块依赖于某些东西,它将拖拽它。这种方法的问题是,我在这里读到Entities
模块中的所有bean将被创建两次(尽管最后只保留一个实例),这是一个昂贵且不必要的操作。
我很想听听人们是如何解决这个用例的,因为我认为我还没有遇到任何极端情况。
感谢 我最终使用的语法是classpath*:META-INF/*/*Context.xml
,因为Thomasz建议的语法有一些问题。
有关其他阅读,请参阅spring的bug报告(部分解决了该问题)和关于该问题的博客文章
如果遵循配置文件的一些命名约定并简单地选取CLASSPATH上所有可用的文件,会怎么样?
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:*Context.xml
</param-value>
</context-param>
这个解决方案假定所有必需的模块都在CLASSPATH上,但也假定不需要的模块不在那里。
您考虑过使用基于注释的配置吗?
这应该允许您将XML配置的大小减少到只有几行。
或者,使用基于顶级Java的配置将允许您以受控的方式(无需搜索整个类路径)拉入您想要的部分,并且没有任何重复的bean或任何XML文件。