java - 如何进行多模块 Spring 配置?

标签 java spring

我有一个多模块(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>

结合通配符导入,这将:

  1. 收集在 ApplicationContext 中找到的所有 bean 实现MyCoolPluginInterface并将它们包装在注册为 beanList 的列表中在 ApplicationContext .
  2. 允许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/

相关文章:

java - 具有数据绑定(bind)的 Recyclerview 无法检测 onClick 操作

java - 创建名称为 '...RedisHttpSessionConfiguration' 的 bean 时出错 : Initialization of bean failed

java - Spring 如何使用 Java 8 类,却又在 Java 7 上运行?

java - Spring Boot启动器安全性未进行身份验证

java - 选择 GQLQueries (JDO) Google app Engine JAVA 中的特定行

Java:同步对象指针?

java - 一起使用 Neo4j Core Java API 和终端控制台

java - 如何在 Spring java 中获取 RetryTemplate.execute 的结果?

spring - 将代理与 HttpComponentsClientHttpRequestFactory 和 RestTemplate 一起使用

java - 当我启动 Spring 项目时, Controller 方法将被调用三次