我有一个多模块(maven) Spring 构建。所有模块都发布了一些 bean,并且大多数模块还使用了在依赖关系图中进一步定义的 bean。虽然大部分是注解声明的bean,但几乎每个模块也有一两个xml声明的bean。
虽然我们有一个半体面的解决方案,但我真的想知道在这种情况下组织 xml 文件的正确/最佳方式是什么?您是在模块之间使用导入还是有其他方式?你是把所有的 xml 文件放在一个地方还是根据依赖关系图分散它们?您的解决方案如何处理部分 spring 上下文(典型的集成测试)?
我还希望以一种可以让我最佳地利用我的 IDE 的 spring 支持(IDEA 和一些 eclipse 用户)的方式来组织它。
最佳答案
我们在模块中使用通配符导入来允许其他模块向声明导入的模块贡献 bean:
<import resource="classpath*:com/acme/**/*-core-support.xml" />
模块化
想要贡献给“主机”的模块只需在 src/main/resources/com/acme
中放置一个正确命名的文件。在这种情况下将自动拾取。如果你使用类路径扫描(<context:component-scan />
会变得更容易)。
在这方面有帮助的另一件事是一些小的 Spring 扩展,它可以拾取给定类型的 bean 并将它们重新发布到 ApplicationContext
再次。通过这样做:
<plugin:list id="beanList" class="com.acme.MyCoolPluginInterface" />
<bean class="com.acme.MyPluginHost">
<property name="plugins" ref="beanList" />
</bean>
结合通配符导入,这将:
- 收集在
ApplicationContext
中找到的所有 bean 实现MyCoolPluginInterface
并将它们包装在注册为beanList
的列表中在ApplicationContext
. - 允许
MyPluginHost
引用该列表。
事实上,您现在可以通过将插件模块添加到类路径(在 Maven 中也称为依赖项)来简单地扩展您的应用程序。
这个小小的 Spring 扩展被称为 Spring Plugin,并在 Apache 2 许可下发布。见 http://github.com/SpringSource/spring-plugin了解更多信息。还有更高级的sample project在 Github 上,它展示了它是如何工作的,并在 GitHub 上改进了模块化。该应用程序是我的“哎呀!我的架构去哪儿了?”的示例代码。您可以看到 slides here 的演示文稿或观看 recording here .
不同的环境
通常我们将应用程序配置为在目标环境中运行(使用 JNDI 查找等)。当然你想使用标准 PropertyPlaceholderConfigurer
外部化配置的机制,这些配置必须由管理员接触或将通过各种环境进行更改。
对于集成测试,我们通常在 src/main/test
中有额外的配置文件另外加载到正常的配置文件中覆盖将配置绑定(bind)到环境的关键bean。例如。如果您的普通配置文件中有数据源
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" />
你可以在你的 test-context.xml
中覆盖它通过使用
<bean id="dataSource" class="...DataSource" />
<!-- config -->
</bean>
并在测试类中在原来的那个之后导入
@ConfigurationContext(locations = {"app-context.xml", "test-context.xml"})
public FooBarIntegrationtest {
// ...
}
关于java - 如何进行多模块 Spring 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/748377/