何为SPI
SPI:全称是Service Provider Interface,全称是服务提供者接口
它是从Java 6引入是基于ClassLoader发现并加载服务机制。
- Service 定义抽象功能模块的公开接口或抽象类。
- Service Provider 是Service接口实现类。ServiceLoader
- ServiceLoader 是SPI机制中的核心组件负责在运行过程中发现和加载Service Provider。
SPI流程
ServiceLoader加载和发现Service Provider,而Service Provider具体实现Service接口

SPI原理
我们拿JDBC举例: JDBC的流程:
- 加载驱动
- 打开链接
- 执行语句
- 处理结果集
- 关闭连接 其中,我们关注加载驱动,我们使用它Class.forName()加载驱动。
有了SPI,程序员不需要更改驱动名称,只需要引入相应的JAR包即可;
Java SPI三大规范要素
- 文件路径:必须在JAR包中META-INF/services目录下
- 文件名称: Service界面全限定名
- 文件内容:Service 实现类的全限定名。若有多个实现类,则每个实现类在文件中单独占据一行
- Service接口实现类,即Service Provider类别,必须有无参数的默认结构方法。因为当反射技术实例化时,它没有参数。
总结:
- :为实现各种插件或灵活更换框架所用的组件提供了一种发现和注册的方法。
- :模块之间的解耦优雅地基于面向接口编程。
- :面向接口+配置文件+反射技术
- :JDBC · SLF4J . Servlet容器初始化·等等…
源码连接:https://gitee.com/yuehewei/java-spi.git 学习播主:https://www.bilibili.com/video/BV1RY4y1v7mN 只是整理视频的笔记;