DPL,全称:Dynamic Plug-In Loader。这是一款基于Spring环境构建的简易版动态插件加载开发套件。 它的主要作用是支持在Spring环境中不重启主系统的情况下实现插件的热部署。
- 插件:Plug-In,是一种基于某些约定接口或规范来实现的程序,它必须依赖主系统运行。
- 热部署:在不重启主系统的前提下,可以更新插件。
❗ 仅支持插件中如下注解声明的类才会装载到SpringContext(需要更多支持请自行扩展
):
org.springframework.stereotype.Component.class
org.springframework.stereotype.Repository.class
org.springframework.stereotype.Service.class
org.springframework.stereotype.Controller.class
- 主系统定时(默认1分钟)扫描一次插件目录中(../plugins/)插件文件(xxx-plugin.jar)的变化;
- 扫描发生变化的插件里的注解类,这些类通过 AnnotationConfigApplicationContext 加载到Spring中;
- 加载完成后将插件注册到 PluginBus 容器里;
- 主系统可以通过 PluginBus 容器查找到插件,调用插件里的类和方法。
implementation 'io.github.big-mouth-cn:spring-boot-starter-dpl:1.0.0'
<dependency>
<groupId>io.github.big-mouth-cn</groupId>
<artifactId>spring-boot-starter-dpl</artifactId>
<version>1.0.0</version>
</dependency>
如果不在SpringBoot环境里使用,请修改成 spring-dpl 的依赖。
@Autowired
private PluginBus pluginBus;
Plugin plugin = pluginBus.lookup("demo-plugin");
MethodService methodService = plugin.getService(MethodService.class);
Object res = methodService.getMethodHandle();
首先通过 IDEA 启动 spring-dpl-example-container 项目的 ContainerApplication 类。
GET http://localhost:8080/get?pluginKey=demo-plugin
接口返回:Hello, I'm DemoMethodService, get method handle.
,表示插件被成功执行。
删除 plugins 目录下的 spring-dpl-example-plugin-demo-1.0.0.jar。
再次请求测试接口(第二步)。此时接口返回:plugin not found
,表示插件已经卸载了。
重新将 spring-dpl-example-plugin-demo-1.0.0.jar 放入 plugins 目录下。
再次请求测试接口(第二步)。此时接口返回:Hello, I'm DemoMethodService, get method handle.
,表示插件被成功执行。