我们在模块中使用通配符导入以允许其他模块向声明导入的模块贡献 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 中找到的所有实现MyCoolPluginInterface 的bean,并将它们包装在ApplicationContext 中注册为beanList 的列表中。
- 允许
MyPluginHost 引用该列表。
事实上,您现在可以通过将插件模块添加到类路径(在 Maven 中也称为依赖项)来简单地扩展您的应用程序。
这个小小的 Spring 扩展被称为 Spring Plugin,并在 Apache 2 许可下发布。请参阅http://github.com/SpringSource/spring-plugin 了解更多信息。 Github 上还有一个更高级的 sample project,它展示了它是如何工作的,并在 GitHub 上改进了模块化。该应用程序是我的“哎呀!我的架构去哪儿了?”的示例代码。您可以查看slides here 或观看recording here 的演示文稿。
不同的环境
通常我们将应用程序配置为在目标环境中运行(使用 JNDI 查找等)。当然,您希望使用标准的PropertyPlaceholderConfigurer 机制来外部化管理员必须接触或将在各种环境中更改的配置。
对于集成测试,我们通常在src/main/test 中有额外的配置文件,它们会额外加载到普通配置文件中覆盖将配置与环境联系起来的关键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 {
// ...
}