我有一个“核心”模块,其接口为“ DbService”。
该接口的实现在另一个模块“ MsSqlDbService”中(出于不同的目的,我有很多“ DbService”的实现,因此在运行程序之前,我只是将“正确的” jar放在“正确的”位置)
要加载“ DbService”,我使用标准的Java服务加载器java.util.ServiceLoader<DbService>
所以我想知道:有没有办法让我的spring容器管理“ DbService”?
因为现在spring容器为我管理实际上加载“ DbService”的实现的类,而不是管理“ DbService”本身。
最佳答案
(出于不同的目的,我有很多“ DbService”的实现,因此
在运行我的设备之前,我只是将“正确的”罐子放在“正确的”地方
程序)
如果我理解正确,则您有多个JAR都包含同一接口的实现。您想让Spring在部署时拾取类路径中的任何一个,然后将所有东西正确地自动装配在一起?
绝对可以将Spring用作完成此类任务的“穷人插件框架”:
1)在您的主项目中,将此添加到您的上下文中:<import resource="classpath:applicationContext-dbService.xml"/>
2)在每个JAR中,创建一个名为applicationContext-dbService.xml
的文件。对于您提供的SQL Server示例,它看起来像这样。
<bean id="msSqlDbService" class="com.foo.MsSqlDbServiceImpl"/>
3)当您的主上下文被加载时,Spring将扫描类路径中名为
applicationContext-dbService.xml
的文件,然后处理其中定义的所有bean。假设在部署时,类路径上只有一个“插件” JAR,则可以将DbService实例自动连接到主项目中的任何内容。