刚成立的公司怎样做自己网站,设计师联盟网站,木藕设计网站大全,工程项目管理软件免费版文章目录 关于 | About技术文档 | Document开源项目 | Project 案例 | Demo项目结构 | Structure主程序配置集成 | Settings引入框架依赖 | Framework在配置文件加入配置 | YamlSpringBoot启动类改引导类 | Change 插件配置集成 | Settings引入依赖 | XML定义插件引导类 | Clas… 文章目录 关于 | About技术文档 | Document开源项目 | Project 案例 | Demo项目结构 | Structure主程序配置集成 | Settings引入框架依赖 | Framework在配置文件加入配置 | YamlSpringBoot启动类改引导类 | 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.0
开源项目 | Project
开源项目https://gitee.com/starblues/springboot-plugin-framework-parent.git 这个框架除了官方介绍的优点之外也有它的不足之处后文我会提出来。
该框架可以在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
引入框架依赖
dependencygroupIdcom.gitee.starblues/groupIdartifactIdspring-brick/artifactIdversion3.1.0/version/dependency具体主程序的pom文件配置如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.linghu/groupIdartifactIdspringboot-plugin-framework-example-linghu/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdexample-main/artifactIdpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdcom.gitee.starblues/groupIdartifactIdspring-brick/artifactIdversion3.1.0/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-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依赖放到第一个位置, 以防止出现依赖冲突导致无法启动插件--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion${和主程序一致的springboot版本}/version
/dependency!-- spring-brick-bootstrap依赖 --
dependencygroupIdcom.gitee.starblues/groupIdartifactIdspring-brick-bootstrap/artifactIdversion${latest.version}/version
/dependency!-- 主程序依赖 --
!-- 将主程序以 provided 方式依赖到插件中 --
dependencygroupId主程序的 groupId/groupIdartifactId主程序的 artifactId/artifactIdversion主程序 version/versionscopeprovided/scope
/dependency上面是个引入模版大家引入以后还要进行修改下面是我修改的我的完整依赖
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.linghu/groupIdartifactIdspringboot-plugin-framework-example-linghu/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdexample-plugins-basic/artifactIdpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!-- 插件配置集成--!-- spring-boot-starter依赖 --!--建议将spring-boot-starter依赖放到第一个位置, 以防止出现依赖冲突导致无法启动插件--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.7.9/version/dependency!--解决方案: 确保插件不包含spring-boot-starter-web依赖而是让主程序来加载这个依赖。这样主程序就可以管理所有的Spring Boot web依赖避免了重复。如果您使用的是Maven您可以在插件的pom.xml文件中移除对spring-boot-starter-web的依赖或者如果您在主程序的pom.xml中已经定义了这个依赖您可以在插件的pom.xml中添加exclusions元素来排除这个依赖。--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/exclusion/exclusions/dependency!-- spring-brick-bootstrap依赖 --dependencygroupIdcom.gitee.starblues/groupIdartifactIdspring-brick-bootstrap/artifactIdversion3.1.0/version/dependency!-- 主程序依赖 --!-- 将主程序以 provided 方式依赖到插件中 --dependencygroupIdcom.linghu/groupIdartifactIdexample-main/artifactIdversion1.0-SNAPSHOT/versionscopeprovided/scope/dependency/dependencies!-- 插件打包的配置--buildpluginsplugingroupIdcom.gitee.starblues/groupIdartifactIdspring-brick-maven-packager/artifactIdversion3.1.0/versionconfiguration!--当前打包模式为: 开发模式--modedev/mode!--插件信息定义--pluginInfo!--插件id--idexample-plugins-basic/id!--插件入口类, 定义说明见: 定义插件入口类--bootstrapClasscom.linghu.controller.ExamplePlugin/bootstrapClass!--插件版本号--version1.0.0-SNAPSHOT/version/pluginInfo/configurationexecutionsexecutiongoalsgoalrepackage/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
其实这一步工作我已经在上面提到了也就是在引入依赖部分提供了。
!-- 插件打包的配置--buildpluginsplugingroupIdcom.gitee.starblues/groupIdartifactIdspring-brick-maven-packager/artifactIdversion3.1.0/versionconfiguration!--当前打包模式为: 开发模式--modedev/mode!--插件信息定义--pluginInfo!--插件id--idexample-plugins-basic/id!--插件入口类, 定义说明见: 定义插件入口类--bootstrapClasscom.linghu.controller.ExamplePlugin/bootstrapClass!--插件版本号--version1.0.0-SNAPSHOT/version/pluginInfo/configurationexecutionsexecutiongoalsgoalrepackage/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加载不到主程序的 编译打包插件 | JAR
这里打包有两种方法
插件使用maven命令mvn clean package进行编译通过Maven插件、先点击clean、在点击package
我用的第二种方法打包如图 打包完成以后观察target文件下会出现jar包 启动测试 | Main
这个测试是直接启动主程序的
启动主程序main, 日志中出现如下关键内容说明集成插件成功 如上我们还知道了如下信息那就是我们请求测试的接口地址为
http://127.0.0.1:8080/plugins/example-plugins-basic/
打开浏览器访问 http://127.0.0.1:8080/plugins/example-plugins-basic/example出现下图说明访问接口测试成功。 Demo案例Git地址 | Gitee
这个教程属于入门级别的没有对源码原理展开讲解后续有时间会接着更的这里主要是教大家快速上手遇到不懂的欢迎评论区提出。
完整项目demo
《SpringBrick-springboot-plugin-framework-example-linghu》
项目下载以后记得要用Maven插件打一下jar包可以直接运行
mvn clean package进行编译~