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

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

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

我也希望这种组织方式能够让我最佳地利用IDE的弹簧支持(IDEA和一些eclipse用户)。

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

 

模块化

想要贡献给“主机”的模块只需要在src/main/resources/com/acme中放置一个正确命名的文件,以便自动获取。 如果使用类路径扫描(通过 ,它将变得更加容易)。

在这方面有帮助的另一件事是一些小的Spring扩展,它接收给定类型的bean并再次在ApplicationContext重新发布它们。 做这样的事情:

     

结合通配符导入,这将:

  1. 收集在ApplicationContext中找到的所有实现MyCoolPluginInterface ,并将它们包装在ApplicationContext中注册为beanList的列表中。
  2. 允许MyPluginHost引用该列表。

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

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

不同的环境

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

对于集成测试,我们通常在src/main/test中有额外的配置文件,这些配置文件会被加载到正常的配置文件中,从而覆盖将配置绑定到环境的关键bean。 例如,如果您的普通配置文件中有数据源

   

您可以使用在test-context.xml覆盖它

     

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

  @ConfigurationContext(locations = {"app-context.xml", "test-context.xml"}) public FooBarIntegrationtest { // ... } 

我们只是根据用法从多个XML配置文件创建应用程序上下文。

例如,对于没有服务器的测试,通过使用每个服务模块中的所有配置文件来创建上下文。

部署时,我们通过Spring Remoting访问服务,因此客户端使用通过XML配置初始化的应用程序上下文,该配置定义了启用远程处理的代理bean。 同时,服务由测试用例使用的相同XML文件进行配置,但应用程序上下文现在由DispatcherServlet或EJB或MDB加载。

此设置允许我们为每个方案定制应用程序上下文,而无需复制配置文件中的任何信息,这使维护更加简单。 此外,配置文件之间通过导入没有硬依赖关系,因为它是在实际创建ApplicationContext的上层处理的。

由于我们尚未使用它,因此无法对IDE支持发表评论。