【发布时间】:2011-12-08 02:48:47
【问题描述】:
我的 Web 应用程序使用后端服务的默认 impl 运行。应该能够实现接口并将 jar 放入插件文件夹(不在应用程序类路径中)。一旦服务器重新启动,想法是将新的 jar 加载到类加载器中,并让它参与依赖注入。我正在使用 @Autowired 使用 Spring DI。新的插件服务 impl 将具有 @Primary 注释。因此,给定接口的两个 impl,应该加载主接口。
我将 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()");
}
}
//由于没有更好的地方,我从 ContextListener 加载了插件 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 仍然作为服务注入。知道如何让插件 jar 参与 Spring 的 DI 生命周期吗?
编辑: 简单来说,我有一个war 文件,它在war 的plugins 目录中有几个插件jar。根据应用程序查看的配置文件中的值,当应用程序启动时,我想加载该特定插件 jar 并使用它运行应用程序。这样,我可以将战争分发给任何人,他们可以根据配置值选择要运行的插件,而无需重新打包所有内容。这就是我要解决的问题。
【问题讨论】:
标签: java spring jakarta-ee plugins