如何进行多模块弹簧配置?

2022-09-01 21:12:44

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

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

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


答案 1

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

<import resource="classpath*:com/acme/**/*-core-support.xml" />

模块性

想要为“主机”做出贡献的模块只需要在这种情况下放置一个正确命名的文件即可自动拾取。如果您使用类路径扫描(通过它将变得更加容易)。src/main/resources/com/acme<context:component-scan />

在这方面有帮助的另一件事是一些小的Spring扩展,它拾取给定类型的豆子并再次重新发布它们。通过执行如下操作:ApplicationContext

<plugin:list id="beanList" class="com.acme.MyCoolPluginInterface" />

<bean class="com.acme.MyPluginHost">
   <property name="plugins" ref="beanList" />
</bean>

结合通配符导入,这将:

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

事实上,您现在可以通过将插件模块添加到类路径(在 Maven 中称为依赖项)来简单地扩展您的应用程序。

这个微小的Spring扩展名为Spring Plugin,并在Apache 2许可证下发布。有关详细信息,请参阅 http://github.com/SpringSource/spring-plugin。Github上还有一个更高级的示例项目,它显示了它是如何工作的,并改进了GitHub的模块化。该应用程序是我的“哎呀!我的建筑去了哪里?“演示,你可以在这里看到幻灯片或在这里观看录音

不同的环境

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

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

 <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 {
   // ...
 }

答案 2

我们只需根据使用情况从多个 XML 配置文件创建应用程序上下文。

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

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

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

无法评论 IDE 支持,因为我们尚未使用它。


推荐