3

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

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

我最初的意图是在contextConfigLocation参数中只声明配置文件ServiceAServiceB因为这些是 web 应用程序直接依赖的唯一项目(通过查看 maven pom 很容易看到),然后同时拥有ServiceAServiceB在他们的 spring 上下文配置文件中包含这个指令<import resource="classpath:EntitiesContext.xml">。这种方法的优点是它与 maven 传递方法一致,在该方法中我声明了我所依赖的内容,如果该模块依赖于某些东西,它会将它拖到一起。这种方法的问题是我在这里读到模块中的所有 bean 都Entities将被创建两次(尽管最后只保留一个实例),这是一项昂贵且不需要的操作。

我非常想听听人们如何解决这个用例,因为我认为我没有遇到任何极端情况。

谢谢

更新 我最终使用的语法是classpath*:META-INF/*/*Context.xml因为 Thomasz 建议的语法存在一些问题。
如需更多阅读,请参阅 spring 的错误报告(部分解决了该问题)和有关该问题的博客文章

4

2 回答 2

2

遵循一些配置文件的命名约定并简单地选择 CLASSPATH 上可用的所有内容怎么样?

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath*:*Context.xml 
    </param-value>
</context-param>

该解决方案假定显然所有必需的模块都在 CLASSPATH 上,但非必需的模块也不存在。

于 2011-12-05T08:35:12.303 回答
1

您是否考虑过使用基于注释的配置

这应该允许您将 XML 配置的大小减少到几行。

或者,使用基于 Java 的顶级配置将允许您以受控方式(无需搜索整个类路径)提取您想要的部分,并且没有任何重复的 bean 或任何 XML 文件。

于 2011-12-05T08:54:26.223 回答