如何安排spring上下文配置文件,使它们与项目依赖项相匹配



我有一个依赖于其他两个模块的web应用程序。
为简单起见,我们称它们为ServiceA模块和ServiceB模块。
这些模块中的每一个都有各种不同的依赖关系,并且对Entities模块也有一个共同的依赖关系。上面提到的每个模块都声明了自己的spring上下文文件,其中包含与它的作用域相关的信息。我现在正试图决定如何在项目之间"连接"这些配置文件,我有点难倒了。

我知道一个选项是只是声明所有的"结束"文件(即ServiceA, ServiceB和实体)在web应用程序的web.xml(在contextConfigLocation参数),但我不喜欢这个选项,特别是因为我的实际用例是更复杂的,有更多的内部依赖关系共享。

我最初的意图是在contextConfigLocation参数中声明ServiceAServiceB的配置文件,因为这些是web应用程序直接依赖的唯一项目(这很容易通过查看maven pom看到),然后有ServiceAServiceB在其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文件。

最新更新