- 一、前言
- 二、背景
- 三、项目简介
- 四 、看效果
- 4.1 测试主程序接口
- 4.2 测试A插件程序接口
- 4.3 测试B插件程序接口
- 五 、展望
二、背景笔者在工作中遇到经常更改服务层的代码,就只是更改一小部分,但是就需要重启整个程序才能完成编译,既费时又费力。想寻求一种方法,能够在不重新编译整个应用程序的情况下更新服务层代码。想到的第一个方法是通过动态加载jar文件来更新,但是SpringBoot应用上下文还没搞太清楚,后续可以按照这个思路走下去;第二个方法是把需要更新的服务层以插件的方式运行,就是今天所要介绍的SBP框架,它能够将使得主程序模块加载其它模块的控制器、服务层、数据访问层的代码,完成插件式的编程,实现插件的动态的启动、停止以及删除。
项目sbp是基于springboot做的封装框架,已经初步成熟,可以投入到项目中使用。如何快速理解sbp项目,没有比跑通更为直接的了,就像玩游戏先玩后摸索。
由于sbp项目没有清晰地叙述构建插件编程的流程,因此又查询基于sbp的使用仓库,于是查找到sbp-test用来测试sbp的使用。
而sbp-test项目又引入了很多杂项,因此我就精简了该项目,用于新手快速上手跑通sbp项目。代码我也上托管到了Git仓库,传送门在此,可以直接下载享用。
整个项目的目录结构如下所示。主模块是application,是一个springboot-web应用。
主程序的资源文件内容如下。
server.port: 8071
spring:
mvc:
static-path-pattern: /**
resources:
add-mappings: true
cache:
period: 3600
sbp:
runtime-mode: development
# runtime-mode: deployment
plugins-root: plugins
enabled: true
lib-directories:
- "libs"
# auto-start-plugin: false
classes-directories:
- "target/classes"
# - "out/production/classes"
# - "out/production/resources"
# controller:
# base-path: "fr/trouillet"
其中plugins文件夹里包含两个插件a、b。
在这两个插件里分别实现了两个控制器。其中a插件的控制器代码如下。
@RestController
@RequestMapping(value = "/aplugin")
public class APluginController {
@RequestMapping(value = "/name")
public String name() {
return "aplugin";
}
}
b插件的控制器代码如下。
@RestController
@RequestMapping(value = "/bplugin")
public class BPluginController {
@RequestMapping(value = "/name")
public String name() {
return "bplugin";
}
}
四 、看效果
4.1 测试主程序接口
接口地址为:http://127.0.0.1:8071/plugins/id
测试结果:
接口地址为:http://127.0.0.1:8071/aplugin/name
测试结果:
接口地址为:http://127.0.0.1:8071/bplugin/name
测试结果:
现在依旧不是需要的结果,这是直接运行起来的结果,不是动态的加载。后续再进一步研究。



