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

时间:2009-04-14 16:30:29

标签: java spring

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

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

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

2 个答案:

答案 0 :(得分:22)

我们在模块中使用通配符导入,以允许其他模块为模块声明导入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的{​​{1}}中找到的所有bean,并将其包装在MyCoolPluginInterface中注册为beanList的列表中。
  2. 允许ApplicationContext引用该列表。
  3. 事实上,您现在可以通过向类路径添加插件模块(也就是Maven中的依赖项)来扩展您的应用程序。

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

    不同的环境

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

    对于集成测试,我们通常在PropertyPlaceholderConfigurer中有额外的配置文件,将另外加载到正常的配置文件,覆盖将配置绑定到的关键bean环境。例如。如果您的普通配置文件中有数据源

    src/main/test

    您可以使用

    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" /> 中覆盖此内容
    test-context.xml

    并在测试类

    中之后导入
     <bean id="dataSource" class="...DataSource" />
        <!-- config -->
     </bean>
    

答案 1 :(得分:2)

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

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

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

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

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