【每天学习一点点】SPI机制、Springboot自动配置、nacos插件机制以及使用Spring-plugin策略模式
创始人
2025-06-01 18:09:53
0

一、今天学习知识点

  1. 学习插件机制、了解nacos的插件机制

二、spring插件机制

在设计原则中有一个原则:依赖倒转原则,应该面向接口编程,也就是说应该依赖接口而不是依赖具体的实现,依赖接口,接口具有不同类型的实现,因此可以提高系统的扩展性,如果仅仅是依赖实现,那么就无法进行扩展了。

插件机制也就是一种可插拔的组件,也就是我们产品A需要用到功能B,这个功能B是一个接口,它的实现可以由我们引入外部jar来定义,或者在产品中实现多种实现。

2.1 spi机制

SPI全称(Service Provider interface),是JDK内置的一种服务提供发现机制,也就是一种插件机制。

其中工作原理,我们在工程中定义了一个接口A,在启动的时候会去CLASSPATH路径下的META-INF/services中,找到对应接口全路径下的文件文件,该文件内容是返回了一个实现类的全路径名称,这样就会将接口A的实现类给加载到工程中。

在这里插入图片描述
spi机制可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现具体的。

2.1.1 数据库驱动案例

我们程序引入的mysql,必然会引入一个mysql-connector-java

   mysqlmysql-connector-java${mysql-connector-java.version}

这里打开对应的jar就存在一个文件
在这里插入图片描述
这里的文件名 java.sql.Driver 其实就是一个全路径接口

这里的com.mysql.cj.jdbc.Driver就是该接口的一个实现类。
在这里插入图片描述
在DriverManager类中会去初始化对应Drivers
在这里插入图片描述

这里可以使用ServiceLoader调用对应接口实现类

 ServiceLoader loadedDrivers = ServiceLoader.load(Driver.class);

那么我们也可以使用对应的ServiceLoader.load获得我们接口的实现类。

底层使用classLoader通过fullName来获得对应的资源信息。
在这里插入图片描述
获得了对应的全路径名称,调用CLass.forName来加载对应class文件
在这里插入图片描述
class.forName可以在运行时动态加载对应类加载器下的资源class文件,这里的loader是属于应用类加载器,常见的类加载器有根类加载、扩展类加载、应用类加载器;

应用类加载器可以加载我们的jar下的文件资源,因此class.forName可以加载对应class文件。

然后通过反射获得对应对象

S p = service.cast(c.newInstance());

2.3 SPI缺点

  1. SPI机制会全部加载到内存,不会按需加载。
  2. 多个线程操作ClassLoader会导致并发问题(待调研)

2.2 springboot自动配置

我们springboot也提供类型SPI机制的插件形式,springboot提供自动配置的功能,如果在系统中引入了对应start的jar包,那么该jar的信息会被自动加载到spring bean中。
在这里插入图片描述
springboot在启动的时候也会去加载类加载下的 spring.factories文件,然后会立马内容,解析自动配置的实现类。

比如mybatis的自动配置是org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

该配置提供了诸多注解来自定义加载对应的bean到spring 容器中,因此会被spi机制更加高效,而是更加适应spring开发环境
在这里插入图片描述

三、nacos插件机制

在这里插入图片描述

在nacos中,提供了诸多插件机制,那么我们需要清楚这些插件是如何实现的,并且是否具备默认实现,以及我们使用了nacos我们如何定义我们的插件提供扩展的能力呢?

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...