「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架

文章目录

    • 关于 | About
      • 技术文档 | Document
      • 开源项目 | Project
    • 案例 | Demo
      • 项目结构 | Structure
      • 主程序配置集成 | Settings
        • 引入框架依赖 | Framework
        • 在配置文件加入配置 | Yaml
        • SpringBoot启动类改引导类 | Change
      • 插件配置集成 | Settings
        • 引入依赖 | XML
        • 定义插件引导类 | Class
        • 配置Maven打包插件 | Maven
      • 新增Controller接口API | API
      • 编译打包插件 | JAR
      • 启动测试 | Main
    • Demo案例Git地址 | Gitee

工作项目中用到了这款插件式开发框架,看了一下网上教程不多,所以打算为大家普及一下这个技术框架,写一些入门教程方便大家学习运用。

关于 | About

“Spring-brick”,是一个可以动态扩展系统的框架,最早在2019年开始开发,该框架可以在SpringBoot项目上开发插件功能,开发插件就像开发独立应用一样。

这里的插件我们可以理解成一个独立的SpringBoot应用,微服务等单体项目。

技术文档 | Document

文档如下:https://www.yuque.com/starblues/spring-brick-3.0.0image-20240315154413130

开源项目 | Project

开源项目:https://gitee.com/starblues/springboot-plugin-framework-parent.git

image-20240315154511290

这个框架除了官方介绍的优点之外,也有它的不足之处,后文我会提出来。

该框架可以在spring-boot项目上开发出插件功能,在插件中可以和spring-boot使用方式一模一样。使用了本框架您可以实现如下需求:

  • 在插件中,您可以当成一个微型的spring-boot项目来开发,简单易用。
  • 在插件中扩展出系统各种功能点,用于系统灵活扩展,再也不用使用分支来交付不同需求的项目了。
  • 在插件中可以集成各种框架及其各种spring-boot-xxx-starter
  • 在插件中可以定义独立依赖包了,再也不用在主程序中定义依赖包了。
  • 可以完美解决插件包与插件包、插件包与主程序因为同一框架的不同版本冲突问题了。各个插件可以定义同一依赖的不同版本框架。
  • 无需重启主程序,可以自由实现插件包的动态安装部署,来动态扩展系统的功能。
  • 插件也可以不依赖主程序独立集成微服务模块。
  • 您可以丰富想象该框架给您带来哪些迫切的需求和扩展,以实现系统的低耦合、高内聚、可扩展的优点。

案例 | Demo

本次演示一个入门小案例,让我带大家快速进入这个框架,上手使用它。这个案例是我自己写的一个便于大家快速入门的案例,不容易出现错误,清晰明了的入门教程。

项目结构 | Structure

项目名称: springboot-plugin-framework-example-linghu

├─example-main
│  │  pom.xml
│  │  
│  ├─src
│  │  ├─main
│  │  │  ├─java
│  │  │  │  └─com
│  │  │  │      └─linghu
│  │  │  │              MainApp.java
│  │  │  │              
│  │  │  └─resources
│  │  │          application.yml
│     
└─example-plugins-basic│  pom.xml│  ├─src│  ├─main│  │  ├─java│  │  │  └─com│  │  │      └─linghu│  │  │          ├─controller│  │  │          │      ExampleController.java│  │  │          │      ExamplePlugin.java│  │  │          │      │  │  │          └─plugin│  │  └─resources│  │          application.yml

这个项目分为两个部分:

  • 主程序-example-main
  • 插件程序-example-plugins-basic

我们的目的是运行主程序,然后执行插件程序里的业务,这样我们就可以专注开发插件程序了,可以不断根据业务的不同接入不同的插件程序,而不用去动主程序的代码,这就是我们说的 高内聚、低耦合、可扩展

分好类以后我们开始接下来的具体工作。

我们的工作分为两个部分:

  • 主程序配置集成 | Settings
  • 插件配置集成 | Settings

主程序配置集成 | Settings

我们说了主程序实际上就是上面 example-main部分。

引入框架依赖 | Framework

引入框架依赖:

<dependency><groupId>com.gitee.starblues</groupId><artifactId>spring-brick</artifactId><version>3.1.0</version></dependency>

具体主程序的pom文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.linghu</groupId><artifactId>springboot-plugin-framework-example-linghu</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>example-main</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.gitee.starblues</groupId><artifactId>spring-brick</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
在配置文件加入配置 | Yaml

这里的yaml文件配置主要是让将插件程序接入到主程序中

plugin:runMode: devmainPackage: com.linghupluginPath:
#    这里集成了一个插件程序example-plugins-basic模块- ~\example-plugins-basic

需要注意的是上面的 mainPackage表示主程序类的路径。pluginPath则是我们插件的相对路径地址。

- ~\example-plugins-basic中的 ~\表示相对路径地址; example-plugins-basic则是我们的插件名称。

完整的yml配置则是:

server:port: 8080plugin:runMode: devmainPackage: com.linghupluginPath:
#    这里集成了一个插件程序example-plugins-basic模块- ~\example-plugins-basic
spring:mvc:pathmatch:matching-strategy: ant_path_matcher
SpringBoot启动类改引导类 | Change

这个改动发生在主程序的启动类上

package com.linghu;import com.gitee.starblues.loader.launcher.SpringBootstrap;
import com.gitee.starblues.loader.launcher.SpringMainBootstrap;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author linghu* @date ${DATE} ${TIME}*/
@SpringBootApplication
public class MainApp implements SpringBootstrap {public static void main(String[] args) {// 该处使用 SpringMainBootstrap 引导启动SpringMainBootstrap.launch(MainApp.class, args);}@Overridepublic void run(String[] args) throws Exception {// 在该实现方法中, 和 SpringBoot 使用方式一致SpringApplication.run(MainApp.class, args);}}

这里为啥要这么改?后续我会出文章解释,剖析源码。

插件配置集成 | Settings

插件程序主要是指:example-plugins-basic部分

引入依赖 | XML
<!-- spring-boot-starter依赖 -->
<!--建议将spring-boot-starter依赖放到第一个位置, 以防止出现依赖冲突导致无法启动插件-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>${和主程序一致的springboot版本}</version>
</dependency><!-- spring-brick-bootstrap依赖 -->
<dependency><groupId>com.gitee.starblues</groupId><artifactId>spring-brick-bootstrap</artifactId><version>${latest.version}</version>
</dependency><!-- 主程序依赖 -->
<!-- 将主程序以 provided 方式依赖到插件中 -->
<dependency><groupId>主程序的 groupId</groupId><artifactId>主程序的 artifactId</artifactId><version>主程序 version</version><scope>provided</scope>
</dependency>

上面是个引入模版,大家引入以后还要进行修改,下面是我修改的我的完整依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.linghu</groupId><artifactId>springboot-plugin-framework-example-linghu</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>example-plugins-basic</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--        =====================插件配置集成========================--><!-- spring-boot-starter依赖 --><!--建议将spring-boot-starter依赖放到第一个位置, 以防止出现依赖冲突导致无法启动插件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.7.9</version></dependency><!--解决方案: 确保插件不包含spring-boot-starter-web依赖,而是让主程序来加载这个依赖。这样,主程序就可以管理所有的Spring Boot web依赖,避免了重复。如果您使用的是Maven,您可以在插件的pom.xml文件中移除对spring-boot-starter-web的依赖,或者如果您在主程序的pom.xml中已经定义了这个依赖,您可以在插件的pom.xml中添加<exclusions>元素来排除这个依赖。--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></exclusion></exclusions></dependency><!-- spring-brick-bootstrap依赖 --><dependency><groupId>com.gitee.starblues</groupId><artifactId>spring-brick-bootstrap</artifactId><version>3.1.0</version></dependency><!-- 主程序依赖 --><!-- 将主程序以 provided 方式依赖到插件中 --><dependency><groupId>com.linghu</groupId><artifactId>example-main</artifactId><version>1.0-SNAPSHOT</version><scope>provided</scope></dependency></dependencies><!--    =================插件打包的配置===================--><build><plugins><plugin><groupId>com.gitee.starblues</groupId><artifactId>spring-brick-maven-packager</artifactId><version>3.1.0</version><configuration><!--当前打包模式为: 开发模式--><mode>dev</mode><!--插件信息定义--><pluginInfo><!--插件id--><id>example-plugins-basic</id><!--插件入口类, 定义说明见: 定义插件入口类--><bootstrapClass>com.linghu.controller.ExamplePlugin</bootstrapClass><!--插件版本号--><version>1.0.0-SNAPSHOT</version></pluginInfo></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>
定义插件引导类 | Class

这个引导类是加在插件里的主类里的,不要搞错了。

package com.linghu.controller;import com.gitee.starblues.bootstrap.SpringPluginBootstrap;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author linghu* @date 2024/3/15 9:55*/
@SpringBootApplication
public class ExamplePlugin extends SpringPluginBootstrap {public static void main(String[] args) {new ExamplePlugin().run(args);}}

定义插件main入口类, 继承SpringPluginBootstrap类, 然后在main函数中实例化当前引导类,并执行run方法即可。

配置Maven打包插件 | Maven

其实这一步工作我已经在上面提到了,也就是在引入依赖部分提供了。

<!--    =================插件打包的配置===================--><build><plugins><plugin><groupId>com.gitee.starblues</groupId><artifactId>spring-brick-maven-packager</artifactId><version>3.1.0</version><configuration><!--当前打包模式为: 开发模式--><mode>dev</mode><!--插件信息定义--><pluginInfo><!--插件id--><id>example-plugins-basic</id><!--插件入口类, 定义说明见: 定义插件入口类--><bootstrapClass>com.linghu.controller.ExamplePlugin</bootstrapClass><!--插件版本号--><version>1.0.0-SNAPSHOT</version></pluginInfo></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

新增Controller接口API | API

其实这个接口我们就加在插件程序里就行了

package com.linghu.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author linghu* @date 2024/3/15 9:58*/@RestController
@RequestMapping("/example")
public class ExampleController {@GetMappingpublic String hello(){return "hello";}
}

注意一下Controller位置,放错了很容易导致后续Controller加载不到主程序的:

image-20240315163409936

编译打包插件 | JAR

这里打包有两种方法:

  • 插件使用maven命令:mvn clean package进行编译
  • 通过Maven插件、先点击clean、在点击package

我用的第二种方法打包,如图:

image-20240315163849557

打包完成以后,观察target文件下会出现jar包:

image-20240315163925679

启动测试 | Main

这个测试是直接启动主程序的

  • 启动主程序main, 日志中出现如下关键内容,说明集成插件成功

image-20240315164322248

image-20240315164443221

如上我们还知道了如下信息,那就是我们请求测试的接口地址为:

http://127.0.0.1:8080/plugins/example-plugins-basic/

打开浏览器,访问: http://127.0.0.1:8080/plugins/example-plugins-basic/example出现下图说明访问接口测试成功。

image-20240315164521738

Demo案例Git地址 | Gitee

这个教程属于入门级别的,没有对源码,原理展开讲解,后续有时间会接着更的,这里主要是教大家快速上手,遇到不懂的,欢迎评论区提出。

完整项目demo:

《SpringBrick-springboot-plugin-framework-example-linghu》

项目下载以后记得要用Maven插件打一下jar包,可以直接运行:

mvn clean package进行编译~

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

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

相关文章

JUnit 面试题及答案整理,最新面试题

JUnit中的断言&#xff08;Assert&#xff09;有哪些类型&#xff1f; JUnit提供了多种断言类型来帮助测试代码的正确性。常见的断言类型包括&#xff1a; 1、assertEquals&#xff1a; 用于检查两个值是否相等。如果不相等&#xff0c;测试失败。 2、assertTrue和assertFal…

sqllab第二十五A关通关笔记

知识点&#xff1a; 数值型注入双写绕过 oorranand这里不能用错误注入&#xff08;固定错误回显信息&#xff09;联合注入 测试发现跟25关好像一样&#xff0c;就是过滤了and or # 等东西 构造payload:id1/0 发现成功运算了&#xff0c;这是一个数值型的注入 构造payload:id…

高效使用 JMeter 生成随机数:探索 Random 和 UUID 算法

在压力测试中&#xff0c;经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值&#xff0c;本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数&#xff0c;其中最常用的是__Random函数。该函数可以生成一个指定范围内的随机整数或浮…

瑞_Redis_短信登录(二)

文章目录 项目介绍1.1 项目准备1.2 基于Session实现登录流程1.2.1 发送短信验证码1.2.2 短信验证码登录、注册1.2.3 校验登录状态 1.3 实现发送短信验证码功能1.3.1 页面流程1.3.2 代码实现 1.41.51.6 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的…

lua脚本的基础内容

官方地址&#xff1a;http://luajit.org/ 官方wiki地址&#xff1a;http://wiki.luajit.org/Home 推荐书籍&#xff1a; OpenResty 最佳实践&#xff1a;https://moonbingbing.gitbooks.io/openresty-best-practices/content/ lua基础文档&#xff1a;https://www.runoob.com/l…

【网络】负载均衡

OSI模型每一层的负载均衡 在OSI模型中&#xff0c;每一层的负载均衡具体如下&#xff1a; 1. 第二层&#xff08;数据链路层&#xff09;&#xff1a;数据链路层的负载均衡通常涉及对MAC地址的操作。在这一层&#xff0c;可以使用虚拟MAC地址技术&#xff0c;外部设备对虚拟MA…

【SQL Server】实验七 数据完整性

1 实验目的 掌握实体完整性、参照完整性和用户自定义完整性约束的创建方法。掌握完整性约束的运行检查机制。掌握参照完整性的级联删除和修改方法。掌握正确设计关系模式完整性约束的方法。 2 实验内容 2.1 掌握实体完整性约束的创建和使用方法 创建表时定义由一个属性组成…

解决Linux中Eclipse启动时找不到Java环境的问题

按照报错的意思是没有在/usr/local/eclipse/jre/bin/java下找到java环境&#xff0c;我检查了一下eclipse的目录结构发现在/usr/local/eclipse没有jre/bin/java&#xff0c;我的想法是自己建对应文件夹然后软连接到我的java环境 cd /usr/local/eclipse sudo mkdir jre cd jre s…

将OpenCV与gcc和CMake结合使用

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0开源计算机视觉库在 Linux 中安装 下一篇&#xff1a; 引言&#xff1a; 近年来&#xff0c;计算机视觉技术在图像处理、目标检测和机器人等方面得到了广泛的应用…

论文篇00-【历年论文真题考点汇总】与【历年论文原题2009~2023年文字版记录】(2024年软考高级系统架构设计师冲刺知识点总结-论文篇-先导篇)

专栏系列文章推荐: 案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】 综合知识篇00-综合知识考点汇总目录 ...... 历年真题论文题考点汇总 历年软考系统架构设计师论文原题(2009-2022年) 因最新的2023年目前仅能搜索到回忆版,等楼主搜集到…

关于数据通信知识的补充——第二篇

目录 四.二层交换机 5.实现不同vlan通信的原理 方法一&#xff1a;路由器网关 方法二&#xff1a;单臂路由 方法三&#xff1a;三层交换机 五.三层路由技术 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 …

【Stable Diffusion】入门-04:不同模型分类+代表作品+常用下载网站+使用技巧

目录 1 模型简介2 模型文件构成和加载位置2.1 存储位置2.2 加载模型 3 模型下载渠道3.1 HuggingFace3.2 Civitai 4 模型分类4.1 二次元模型4.2 写实模型4.3 2.5D模型 1 模型简介 拿图片给模型训练的这个过程&#xff0c;通常被叫做“喂图”。模型学习的内容不仅包括对具体事物…

Linux中 vim 编辑器的使用

文章目录 前言一、vim编辑器模式二、简单的插入、保存和退出三、 命令模式下常用命令即其作用1. 命令模式 思维导图 前言 首先&#xff0c;了解一下 什么是vim 编辑器&#xff1f;在不同的系统中&#xff0c;文本的管理也会不同&#xff1b;windos系统就不多说了&#xff0c…

compile→错误: 不支持发行版本 17

错误: 不支持发行版本 17 具体错误描述如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project big-event: Fatal error compiling: 错误: 不支持发行版本 17 -> [Help 1] [ERROR] …

简易版 RPC 框架实现 1.0 -http实现

RPC 是“远程过程调用&#xff08;Remote Procedure Call&#xff09;”的缩写形式&#xff0c;比较通俗的解释是&#xff1a;像本地方法调用一样调用远程的服务。虽然 RPC 的定义非常简单&#xff0c;但是相对完整的、通用的 RPC 框架涉及很多方面的内容&#xff0c;例如注册发…

Redisson 分布式锁原理分析

Redisson 分布式锁原理分析 示例程序 示例程序&#xff1a; public class RedissonTest {public static void main(String[] args) {Config config new Config();config.useSingleServer().setPassword("123456").setAddress("redis://127.0.0.1:6379"…

cool 中的Midway ----node.js的TypeORM的使用

1.介绍 TypeORM | Midway TypeORM 是 node.js 现有社区最成熟的对象关系映射器&#xff08;ORM &#xff09;。本文介绍如何在 Midway 中使用 TypeORM 相关信息&#xff1a; 描述可用于标准项目✅可用于 Serverless✅可用于一体化✅包含独立主框架❌包含独立日志❌ 和老写…

第二十四天-数据可视化Matplotlib

目录 1.介绍 2.使用 1. 安装&#xff1a; 2.创建简单图表 3.图表类型 1.一共分为7类 2.变化 1.折线图 3.分布 ​编辑 1.直方图 2.箱型图 4.关联 1. 散点图&#xff1a; 2.热力图&#xff1a; 5.组成 1.饼图 2.条形图 6.分组 1.簇型散点图 2.分组条形图 3.分…

JOSEF约瑟 TQ-100同期继电器 额定直流电压220V 交流电压100V±10V

TQ-100型同期继电器 TQ-100同期继电器 ​ l 应用 本继电器用于双端供电线路的自动重合闸和备用电源自投装置中&#xff0c;以检查线路电压与母线电压的 相位差和幅值差。 2 主要性能 2 1采用进口集成电路和元器件构成&#xff0c;具有原理先进、性能稳定、可靠性高、动作值精…

Git版本管理--远程仓库

前言&#xff1a; 本文记录学习使用 Git 版本管理工具的学习笔记&#xff0c;通过阅读参考链接中的博文和实际操作&#xff0c;快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: 重学Git-Git远程仓库管理_git remote add origin-CSDN博客 Git学习笔记&am…