【借助pf4j实现基于spring-boot的插件化开发

news2024/11/18 22:57:10

借助pf4j实现基于spring-boot的插件化开发

    • 背景
    • 场景
    • 项目地址&结构
    • Demo运行

背景

JenkinsSonarQube等Java实现的Web应用都有插件体系,一般来说都是先从插件市场下载一个插件,然后系统要求重启(某些功能可以不用重启),插件功能就能在页面上出现,并且还能实时禁用、启用、删除插件。

在某些工具型Web应用中,也需要类似的插件扩展和管理功能,OSGI定义了一套Java应用模块化的规范,Apache和Eclipse都有相应的实现,但是都太重了,PF4J是一个非常好的工具,不管是集成还是功能都有较好的表现,核心原理是通过自定义ClassLoader动态加载和卸载插件,并且提供了插件管理工具。

场景

有一个spring-boot实现的web应用,在某一个业务功能上提供扩展点,用户可以基于SDK实现功能扩展,要求可以管理插件,并且能够在业务功能扩展点出动态加载功能。

项目地址&结构

项目地址:clyoudu/pf4j-spring

pf4j-spring
├── demo
│   ├── manager
│   ├── plugins
│   │   ├── greeting-button-plugin
│   │   ├── system-button-plugin
│   │   └── whether-button-plugin
│   └── sdk
├── pf4j-manager-spring-boot-starter
└── pf4j-spring-core
  1. pf4j-spring-core:PF4J有spring版本pf4j-spring,但是没有和spring-boot集成,并且部分实现想要修改,因此新建了pf4j-spring-core模块,和pf4j-spring几乎一致,修改了部分实现;
  2. pf4j-manager-spring-boot-starter:提供了spring-boot配置类和配置项
  3. demo:一个使用pf4j-manager-spring-boot-starter的完整例子
    • manager:主应用,spring boot web
    • sdk:插件扩展点定义
    • plugins:3个插件4个扩展功能

Demo运行

git clone https://github.com/clyoudu/pf4j-spring.git

编辑pf4j-spring/demo/manager/src/main/resources/application.yml, 重新指定spring.pf4j.path,该路径为插件保存位置

cd pf4j-spring
mvn clean package
cd demo/manager/target
java -jar manager-1.0.0-SNAPSHOT.jar

浏览器访问http://localhost:8080
在这里插入图片描述
Plugin Management:

  1. 上传插件,插件位置:demo/plugins//target/.jar
  2. 点击’Reload’按钮, 插件列表会自动刷新
  3. Load/Unload/Start/Stop/Enable/Disable/Delete等操作会根据不同的插件状态变化

Business Feature:

  1. 插件状态变化,扩展功能列表也会变化
  2. 点击插件按钮,弹出的消息和插件实现预期一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SRM-供应商管理系统搭建指南

1、简介1.1、案例简介本文将介绍,如何搭建SRM-供应商管理。1.2、应用场景供应商可注册、提交、修改自己的基本信息及工商信息,上传资质档案、管理产品及样品信息;企业对供应商是否成为合格供应商或淘汰供应商进行准入流程的审批。2、设置方法…

软件设计(四)--MTBF、MTTF、MTTR

软件设计(三)https://blog.csdn.net/ke1ying/article/details/128808681 31、结构化开发中,过程设计 主要包含对数据结构和算法的设计。 体系结构设计:定义软件的主要结构元素及其关系。 数据设计:基于实体联系图&a…

高压放大器在多波长干涉相位同步解调方法研究中的应用

实验名称:基于激光相位分立调制的多波长干涉相位同步解调方法研究 研究方向:激光测量 测试目的: 在长度测量中,绝对距离测量(ADM)可实现高精度、大范围和瞬时距离测量,与相对位移测量&#xff0…

Dynamsoft Barcode Reader 9.6.1 for NET Crack

Dynamsoft Barcode Reader以每分钟 500 的速度扫描条码 Dynamsoft Barcode Reader具有灵活 API 的强大条码扫描器 SDK Dynamsoft Barcode Reader无论它是模糊的、扭曲的、黑暗的、遥远的还是移动的,我们都可以扫描它。快速地。 业界最快扫描解码,适用于…

一次线上超时问题,看Ribbon 超时机制

一、线上问题 项目上线后,一段时间内运行都没有问题,突然运营人员说,某个接口一直失败。遂查看线上日志: spring-cloud-openfeign 通过服务名调用的,服务发现没有找到可用服务实例?这是第一反应&#xff0…

如何添加PDF书签?学会这三种方法

随着PDF文档和书籍已经成为我们工作和生活中不可或缺的一部分,许多PDF书签制作器和编辑器应运而生。了解使用 Windows、Mac 兼容或在线软件免费将书签添加到 PDF的多种方法。 什么是 PDF 书签? PDF 文件中的书签与印刷书籍中的纸质或织物书签的工作方式…

1609_PC汇编语言_汇编简介以及first例程后续

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 看了一下,当前看的这个章节还剩下几页没有看完。看完之后,做一个简单的整理。 在上一篇笔记中我提到了关于DJGPP的疑惑,也自己找…

RocketMQ源码-NameServer架构设计及启动流程

本文我们来分析NameServer相关代码,在正式分析源码前,我们先来回忆下NameServer的功能: NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能&…

【每日阅读】前端进阶知识点1

如何更改网页中语言属性值 声明当前语言类 html标签更改属性值 lang属性中不区分大小写 en-us en-US 一致 具体可使用 window,document.querySelector(“html”)?.setAttribute(“lang”,newValue); qs库 qs是一个流行的查询参数序列化和解析库。可以将一个普通的object序列…

09_FreeRTOS任务调度器

目录 开启任务调度器vTaskStartScheduler函数 xPortStartScheduler开启任务调度器函数 启动第一个任务 prvStartFirstTask开启第一个任务函数 vPortSVCHandler SVC中断服务函数 出栈/压栈汇编指令详解 开启任务调度器vTaskStartScheduler函数 作用:用于启动任务调度器,…

LaoCat带你认识容器与镜像(实践篇一上)

实践篇主要以各容器的挂载和附加命令为主。 本章内容 Dockerfile基础命令详解。 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 Docker > 20.10.22 从该章开始,我们就进入了Docker实践篇系列了,主要介绍Docker相关附加命令,…

Python中的字符串多样的操作方法

文章目录1.字符串中大小写字母的转变2.字符串的左右中对齐3.字符串查找的方法4.字符串的替换5. 字符串的判断6.字符串的截取7.字符串的拆分8.字符串的拼接9.格式化字符串10.格式化字符串的语法10.12.1 对齐选项([align])10.2 填充选项([fill]…

切入点(pointcut)的申明规则

Spring AOP 用户可能会经常使用 execution切入点指示符。执行表达式的格式如下:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)ret-type-p…

HandlerInterceptorAdapter拦截器多个拦截器时执行的顺序

前提:拦截器加载顺序是 1 2 3.Configuration public class InterceptorConfig implements WebMvcConfigurer {Autowiredprivate Test1neInterceptor test1neInterceptor;Autowiredprivate Test2neInterceptor test2neInterceptor;Overridepublic void addIntercepto…

【Android -- 开源库】权限适配 RxPermissions 的基本使用

运行时权限 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。 系统权限分为两类: 正常权限:只需在你应用的 Androidmanifest.xml 中列出,安装时…

大数据---Hadoop安装教程(一)

Hadoop安装教程前期工作 以下步骤基于网络配置完成,并且能连接xshell和xftp工具 Linux安装: Linux—CentOS 7 64位安装教程 Xshell连接: Linux—Xshell连接 文章目录Hadoop安装教程前期工作安装vim编辑器免密登录ssh登录过程免密登录的原理操作1.免密登录2.开启远程…

比较排序——三路快速排序

快速排序(Quicksort),计算机科学词汇,适用领域Pascal,c等语言,是对冒泡排序算法的一种改进。一、单路排序流程快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设…

e^(-x^2)的原函数(本求法为负面典型,仅供参考)

先放正确答案 ∫−∞∞e−x2π\int _{-\infin} ^{\infin} e^{-x^{2}}\sqrt{\pi}∫−∞∞​e−x2π​ 证法有许多 这是选自点我的一个证明方法。 首先要明确这是一个超越函数 求不了原函数 所以以下部分……纯属失败案例 注:原本在desmos上完成的推导,复制…

stable-diffusion-webui的基础功能手动安装,了解代码结构、依赖、模型出处

前言 虽然,当前有很多stable-diffusion-webui 的一键安装包,但是不易于彻底理解该项目 主要介绍了,手动安装 stable-diffusion-webui 基础功能的过程,手动安装,了解代码结构、依赖、模型出处 一、手动下载stable-dif…

2023 如何学好 Python web 开发?走心局送给大家

1.走心 我在没有接触互联网这个行业的时候, 就一直好奇网站是怎么构建的。 我现在虽然从事互联网相关的工作, 但是也一直没有接触过Web开发之类的东西, 不过兴趣终归还是要有的,还要自己动手去实践的。 Web开发的途径有好多种&am…