如何实现功能插件化

这篇具有很好参考价值的文章主要介绍了如何实现功能插件化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文将介绍两种方式来实现功能插件化:

  1. Java SPI
  2. Spring factories

在整个插件化的方案中,会涉及到如下 3 个组成部分:

  1. 插件定义(即将插件定义为一个接口) 如何实现功能插件化,spring boot,Java,java,spring boot,插件化

  2. 插件实现(即对插件接口的实现)
    如何实现功能插件化,spring boot,Java,java,spring boot,插件化
    这里对同一个插件定义,有两个不同的实现,即 2 个插件:cab5-charging-policy-generalcab5-charging-policy-vip,实现了不同的扣款策略。

  3. 支持插件插拔的平台(因为不知道叫啥,姑且先叫「主项目」吧)

1、Java SPI

SPI 全称 Service Provider Interface,中文译为「服务提供者接口」,JDK 提供的一种服务发现机制,即为某个接口寻找具体的实现。

让我们结合开篇提到的插件化方案所涉及 3 个组成部分,来说明下如何用 SPI 来实现插件化。

  1. 我们要将插件化的功能用接口来进行定义,并接口打成一个 jar 包。

  2. 实现【步骤1】中定义的接口,并将该实现打成一个 jar 包。此时插件就已包装完成,下一步就是「主项目」引入该 jar 包(即插件)。

    这里有一个问题:

    随便一个 jar 包就能成为一个插件吗?

    答案当然是否定的。那问题又来了:

    是通过什么来标识 jar 包是一个插件的呢?

    我们需要在该 jar 包中 META-INF 目录下创建 services 子目录,同时,在该子目录下创建一个以接口(插件定义中的接口)名为文件名的文件,且文件中的内容为接口实现类的全限定名,如下:
    如何实现功能插件化,spring boot,Java,java,spring boot,插件化

  3. 主项目引入插件并使用插件

    首先我们在「主项目」中需要引入「插件定义」以及相关的「插件实现(即插件)」,如下:如何实现功能插件化,spring boot,Java,java,spring boot,插件化
    最后我们再来说下,如何在「主项目」中使用插件,如下图:
    如何实现功能插件化,spring boot,Java,java,spring boot,插件化
    从图中我们可以看到,Java SPI 通过 java.util.ServiceLoader 将插件接口(即 cab5-charging-policy jar 中的 CharginigPolicyPluging)的实现类全部(即 cab5-charging-policy-general jar 中的 ChargingPolicyGeneral 和 cab5-charging-policy-vip jar 中的 ChargingPolicyVip)加载,并通过该类的 iterator 方法将实现插件接口(即 cab5-charging-policy jar 中的 CharginigPolicyPluging)的插件进行遍历(也就是分别调用了 cab5-charging-policy-general jar 中的 ChargingPolicyGeneral 和 cab5-charging-policy-vip jar 中的 ChargingPolicyVip 的 charging 方法)。
    如何实现功能插件化,spring boot,Java,java,spring boot,插件化
    这里又有一个问题:

    ServiceLoader 是如何找到「插件接口」的实现类的呢?

    ServiceLoader 通过扫描「插件实现」的 jar 包中 META-INF/services 目录下的文件,从而得知接口与实现的对应关系,进而找到了接口的所有实现类。

2、Spring factories

Spring factories 是 Spring Boot 一种解耦的扩展机制,它仿照了 Java 的 SPI。采用 Spring factories 来实现功能插件化的过程与 Java SPI 非常类似。主要有以下 2 点不同:

  1. 将 jar 包标识为插件的方式不同

    Spring factories 需要我们在该 jar 包中的 META-INF 目录下创建 spring.factories 文件,文件内容为:接口=实现类的全限定名,如下: 如何实现功能插件化,spring boot,Java,java,spring boot,插件化

  2. 「主项目」加载使用插件的方式不同

    我们需要使用 spring-core 包里的 org.springframework.core.io.support.SpringFactoriesLoader 来加载插件,如下图:
    如何实现功能插件化,spring boot,Java,java,spring boot,插件化
    与 SPI 一样,这里也进一步说明下 SpringFactoriesLoader 是如何找到「插件接口」的实现类的:factories 是通过扫描「插件实现」的 jar 包中 META-INF/spring.factories 文件,从而得知接口与实现的对应关系,进而找到了接口的所有实现类。

3、示例代码

本文的上方有提供对应的示例代码。文章来源地址https://www.toymoban.com/news/detail-517350.html

到了这里,关于如何实现功能插件化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单

       一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑,驳回的立项编辑,在途流程查看。 二、项目管

    2023年04月27日
    浏览(82)
  • Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

       一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑,驳回的立项编辑,在途流程查看。 二、项目管

    2024年02月17日
    浏览(44)
  • java版企业工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

         Java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示1、项目进度图表  2、项目信息 施工地图:1、展示当前角色权

    2024年02月08日
    浏览(52)
  • Java 版 spring cloud + spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

           工程项目各模块及其功能点清单 一、系统管理     1、数据字典:实现对数据字典标签的增删改查操作     2、编码管理:实现对系统编码的增删改查操作     3、用户管理:管理和查看用户角色     4、菜单管理:实现对系统菜单的增删改查操作     5、角色管理:

    2024年02月14日
    浏览(44)
  • 【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、

    😀如果对你有帮助的话😊 🌺为博主点个赞吧 👍 👍点赞是对博主最大的鼓励😋 💓爱心发射~💓 bofryuzursekbiab——密码 访问邮箱域名 邮箱端口 账号 密码 协议 详细配置 JavaMailSender 是 Spring Email 的核心组件,负责发送邮件 MimeMessage 用于封装邮件的相关信息 MimeMessageHelper 用

    2024年02月06日
    浏览(43)
  • 如何通过IDEA创建基于Java8的Spring Boot项目

    上次发现我的 IDEA 创建 Spring Boot 项目时只支持 11 和 17 的 JDK 版本,于是就通过Maven搭建SpringBoot项目。 究其原因,原来是Spring官方抛弃了Java8!!! 使用IDEA内置的Spring Initializr创建SpringBoot项目时,已经没有了Java8的选项,只支持 = 17的版本: 网上逛了一圈,原来是Spring Boot官

    2024年01月19日
    浏览(47)
  • java上传实现 spring boot +element ui

    先从element ui el-upload组件开始介绍。 关于headers 在return里写,这个即可获得headers 目录 1、得到文件上传路径,getUploadPath方法 2、FileUploadUtils里的upload方法,返回一个新的文件名 3、获取url  完整的FileUploadUtils  再来看后台controller 大致步骤分为以下: 1、得到文件上传路径,

    2024年02月12日
    浏览(33)
  • Java实战:Spring Boot实现AOP记录操作日志

    本文将详细介绍如何在Spring Boot应用程序中使用Aspect Oriented Programming(AOP)来实现记录操作日志的功能。我们将探讨Spring Boot集成AOP的基本概念,以及如何使用Spring Boot实现AOP记录操作日志。最后,我们将通过一个具体示例来演示整个实现过程。本文适合已经具备Spring Boot基础

    2024年02月22日
    浏览(47)
  • Java spring-boot项目中如何上传下载文件或图片到spring-boot规定的非静态目录

    spring-boot的项目,虽然它自己定义了一个静态文件的存储目录,但是这个目录一般是作为前端静态文件的目录来作为使用的。如果使用这个静态目录来作为我们上传文件的目录会有一个比较尴尬的地方:将spring-boot打包成为jar包后,随着上传图片的增多,这个jar包也会跟着变大

    2024年02月16日
    浏览(45)
  • 动物宠物领养网站的设计与实现(Vue+Spring Boot+Java)

    目 录 摘 要 I Abstract II 目 录 III 图清单 V 表清单 VII 1 绪论 1 1.1 动物领养网站的现状与发展 1 1.2 “万千宠爱”动物领养网站的研究内容 2 1.3 “万千宠爱”动物领养网站的研究目的和意义 2 1.4 本章小结 3 2 本“万千宠爱”动物领养网站的分析 4 2.1 可行性分析 4 2.2 需求分析 4

    2024年02月04日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包