简介
- 2021-04转向sofastack
- springboot-plugin-framework、文档
- 基于pf4j
- springboot-plugin-framework扩展
- 对mybatis和mybatis-plus进行了支持,插件中可使用mybatis
- 对resources进行了支持,插件中可使用资源文件,从而显示视图层返回模板页面
- 开发时,开发时需要提前将插件编译出jar,再启动主程序
- 从而可让 idea 启动主程序时,自动编译插件包的配置。为了在每次启动主程序的时候,能够动态编译插件包,保证插件包的target是最新的
- 选择 File->Project Structure->Project Settings->Artifacts->点击+号->JAR->From modules whith dependencies->选择对应的插件包->确认OK
- 启动配置: 在Before launch 下-> 点击小+号 -> Build -> Artifacts -> 选择上一步新增的>Artifacts
- 之后启动时会产生一个out/artifacts的目录保存编译好的插件jar包
使用
- 新建插件时,需要继承
BasePlugin
类,并将其放在插件src根目录(插件只能扫描到当前类同级目录或其子目录下的类)- 因为会基于此类进行扫描插件其他类,并进行分组,分组相关逻辑参考包
com.gitee.starblues.factory.process.pipe.classs.group
- 因为会基于此类进行扫描插件其他类,并进行分组,分组相关逻辑参考包
- 插件controller层路径
"http://ip:port/" + server.servlet.context-path + DefaultIntegrationConfiguration.pluginRestPathPrefix + (enablePluginIdRestPathPrefix=true时还需加入插件ID) + Controller#RequestMapping + Method#RequestMapping
- 在插件中无法直接注入主项目Bean,需要通过
PluginUtils
间接获取- PluginUtils可直接注入到插件项目中,然后通过
@PostConstruct
在初始化方法中调用pluginUtils.getMainBean(MainIService.class)
获取主程序Bean - PluginUtils功能:可在插件中获取主程序中Spring容器中的bean,可获取当前插件的信息,只能作用于当前插件
- PluginUtils可直接注入到插件项目中,然后通过
- 插件自定义yml配置,映射Bean时,不能通过
@ConfigurationProperties
注解,而要使用@ConfigDefinition
maven配置说明
1
2
3
4
5
6<!-- 主项目:高版本(>Spring-boot 2.1.1.RELEASE)需要新增repackage -->
<!--
1.插件如果引入了第三方包(而主程序又没有引入的),则需要使用 maven-assembly-plugin 的 jar-with-dependencies 功能将依赖的class全部打包到插件的jar包中
2.打包插件时,必须将插件包与主程序相同的依赖(特别是版本号不同的)排除掉,不要打入jar包中
-->插件相互调用
- 插件1调用插件2方法,插件1的POM中无需引入插件2。主程序也无需引入插件的POM
- 插件1调用插件2方法,插件1中需要重新定义一次插件2中需要调用的方法
- 使用mybatis扩展(参考官方源码中文的)
- xmlLocationsMatch中定义的xml路径不能和主程序中的xml路径在
resources
相对一致,建议使用不同名称区分开。如xmlLocationsMatch.add("classpath:mapper/minions/**/*Mapper.xml");
- 定义的Mapper接口需要加上注解
@Mapper
- 插件默认使用主程序的数据源配置,可通过reSetMainConfig进行重写配置(重写后不影响主程序的配置, 只在当前插件中起作用);插件也可以使用自定义的数据源
- 在插件中无法使用mybatis-plus的
LambdaQueryWrapper
条件构造器,部分场景可使用QueryWrapper + Lombok的@SuperBuilder链式调用 - 插件的mapper.xml文件无法引用主程序中的sql片段
- xmlLocationsMatch中定义的xml路径不能和主程序中的xml路径在
- 使用resources扩展(参考官方源码中文的)
- 插件中需实现接口
StaticResourceConfig
,并映射出静态文件目录如classpath:static/minions
- 插件中
resources
中存放的资源文件目录一定不能和主程序相同,否则就会加载到主程序的资源
- 插件中需实现接口
- 插件依赖其他jar包时配置说明
1 | <!-- sqbiz-plugin父工程 --> |
源码说明
启动流程
1 | // 初始化插件系统入口 |
注册插件流水线处理
PluginClassProcess.java对类进行分组
1 | // 初始化组类型 |
PluginPipeApplicationContextProcessor.java进行插件bean的扫描和注册
1 |
|
PluginInterceptorsPipeProcessor.java处理SpringMVC拦截器
1 |
|
插件注册后流水线处理
Controller处理
1 | // 以 PluginControllerPostProcessor 为例 |
pf4j
- 2021-04转向sofastack
- PF4J 是一个 Java 的插件框架,为第三方提供应用扩展的渠道
- 基于java特性SPI进行开发
- PF4J 本身非常轻量级,只有 50KB 左右,目前只依赖了 slf4j
- Gitblit 项目使用的就是 PF4J 进行插件管理
- 组件
Plugin
是所有插件类型的基类。为了避免冲突,每个插件都被加载到一个单独的类加载器中PluginManager
用于插件管理的所有方面(加载、启动、停止)PluginLoader
加载插件所需的所有信息(类)- 可以将任何接口或抽象类标记为扩展点(即继承
ExtensionPoint
接口),并使用@Extension
标记扩展点的实现类
- 相关生态
- pf4j-update(PF4J的更新机制)
- pf4j-spring(PF4J-Spring框架集成)
- pf4j-wicket(PF4J-Wicket集成)
- pf4j-web(web应用程序中的PF4J)
- springboot-plugin-framework(见下文)
- 案例
1 | // 参考:https://www.cnblogs.com/fengyun2050/p/12809204.html |
- 插件maven打包
1 | <plugin> |