弹簧依赖注入和插件罐
我有使用后端服务的默认 impl 运行的 Web 应用程序。应该能够实现接口并将jar放入插件文件夹(不在apps类路径中)。重新启动服务器后,我们的想法是将新jar加载到类加载器中,并让它参与依赖注入。我正在使用弹簧DI使用@Autowired。新的插件服务 impl 将具有@Primary注释。因此,给定接口的两个 impls,应加载主接口。
我把jar加载到类加载器中,可以手动调用impl。但是我无法参与依赖注入,并让它替换默认的 impl。
下面是一个简化的示例:
@Controller
public class MyController {
@Autowired
Service service;
}
//default.jar
@Service
DefaultService implements Service {
public void print() {
System.out.println("printing DefaultService.print()");
}
}
//plugin.jar not in classpath yet
@Service
@Primary
MyNewService implements Service {
public void print() {
System.out.println("printing MyNewService.print()");
}
}
由于缺乏更好的地方,我从IntextListener加载了插件jar。
public class PluginContextLoaderListener extends org.springframework.web.context.ContextLoaderListener {
@Override
protected void customizeContext(ServletContext servletContext,
ConfigurableWebApplicationContext wac) {
System.out.println("Init Plugin");
PluginManager pluginManager = PluginManagerFactory.createPluginManager("plugins");
pluginManager.init();
//Prints the MyNewService.print() method
Service service = (Service) pluginManager.getService("service");
service.print();
}
}
<listener>
<listener-class>com.plugin.PluginContextLoaderListener</listener-class>
</listener>
即使我已经将jar加载到类加载器中,DefaultService仍然被注入为服务。任何想法,我如何让插件罐参与弹簧的DI生命周期?
编辑:简单地说,我有一个war文件,在war的插件目录中有几个插件jar。根据应用程序查看的配置文件中的值,当应用程序启动时,我想加载该特定的插件jar并使用它运行应用程序。这样,我可以将战争分发给任何人,他们可以根据配置值选择要运行的插件,而不必重新打包所有内容。这就是我试图解决的问题。