如何制作多模块弹簧配置?

kro*_*old 24 java spring

我有一个多模块(maven)弹簧构建.所有模块都发布了一些bean,并且大多数模块都使用依赖关系图中进一步定义的bean.虽然它的大多数是注释声明bean,但几乎每个模块都有一个或两个xml声明的bean.

虽然我们有一个不太合适的解决方案,但我真的想知道在这种情况下组织xml文件的正确/最佳方式是什么?你在模块之间使用导入还是有其他方法?您是否将所有xml文件放在一个位置或根据依赖关系图将它们分散?您的解决方案如何处理部分弹簧上下文(典型的集成测试)?

我还希望以一种方式组织这种方式,以便我最佳地利用IDE的弹簧支持(IDEA和一些eclipse用户).

Oli*_*ohm 22

我们在模块中使用通配符导入以允许其他模块向模块声明bean以声明导入:

<import resource="classpath*:com/acme/**/*-core-support.xml" />
Run Code Online (Sandbox Code Playgroud)

模块化

想要贡献给"主机"的模块只需要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>
Run Code Online (Sandbox Code Playgroud)

结合通配符导入,这将:

  1. 收集在该ApplicationContext工具中找到的所有bean ,MyCoolPluginInterface并将它们包装在注册的列表beanListApplicationContext.
  2. 允许MyPluginHost引用该列表.

实际上,您现在可以通过向类路径添加插件模块(也就是Maven中的依赖项)来扩展您的应用程序.

这个微小的Spring扩展名为Spring Plugin,并在Apache 2许可下发布.有关详细信息,请参阅http://github.com/SpringSource/spring-plugin.在Github 上还有一个更高级的示例项目,它展示了它如何工作并改善了GitHub的模块化.该应用程序是我的"哎呀!我的架构在哪里?"的示例代码.您可以在此处查看幻灯片或在此处观看录制的演示文稿.

不同的环境

通常我们将应用程序配置为在目标环境中运行(使用JNDI查找和内容).当然,您希望使用标准PropertyPlaceholderConfigurer机制来外部化管理员必须触及的配置,或者通过各种环境进行更改.

为了能够集成测试,我们通常有额外的配置文件src/main/test是得到加载额外的正常配置文件覆盖的是领带的配置环境的关键豆.例如,如果您的普通配置文件中有数据源

 <jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" />
Run Code Online (Sandbox Code Playgroud)

你可以test-context.xml通过使用覆盖它

 <bean id="dataSource" class="...DataSource" />
    <!-- config -->
 </bean>
Run Code Online (Sandbox Code Playgroud)

并在测试类中导入原始的之后

 @ConfigurationContext(locations = {"app-context.xml", "test-context.xml"})
 public FooBarIntegrationtest {
   // ...
 }
Run Code Online (Sandbox Code Playgroud)