我有一个多模块(maven)弹簧构建。所有模块都发布了一些bean,并且大多数模块都使用依赖关系图中进一步定义的bean。虽然大多数是注释声明bean,但几乎每个模块都有一个或两个xml声明的bean。
虽然我们有一个不太合适的解决方案,但我真的想知道在这种情况下组织xml文件的正确/最佳方式是什么?你在模块之间使用导入还是有其他方法?您是否将所有xml文件放在一个位置或根据依赖关系图将它们分散?您的解决方案如何处理部分弹簧上下文(典型的集成测试)?
我还希望以一种方式组织这种方式,以便我最佳地利用IDE的弹簧支持(IDEA和一些eclipse用户)。
答案 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>
结合通配导入,这将:
ApplicationContext
的{{1}}中找到的所有bean,并将其包装在MyCoolPluginInterface
中注册为beanList
的列表中。ApplicationContext
引用该列表。事实上,您现在可以通过向类路径添加插件模块(也就是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支持。