Java SPI
时间:2023-11-22 13:37:02
何为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()加载驱动。JDBC要求Driver实现类在类加载时,可以自动注册自己的实例对象DriverManager 从而加载数据库驱动。
有了SPI,程序员不需要更改驱动名称,只需要引入相应的JAR包即可;
Java SPI三大规范要素
标准配置文件:
- 文件路径:必须在JAR包中META-INF/services目录下
- 文件名称: Service界面全限定名
- 文件内容:Service 实现类的全限定名。若有多个实现类,则每个实现类在文件中单独占据一行
Service Provider类必须有无参默认结构方法:
- Service接口实现类,即Service Provider类别,必须有无参数的默认结构方法。因为当反射技术实例化时,它没有参数。
确保能够加载到配置文件和Service Provider类:
总结:
- 作用:为实现各种插件或灵活更换框架所用的组件提供了一种发现和注册的方法。
- 优点:模块之间的解耦优雅地基于面向接口编程。
- 设计思想:面向接口+配置文件+反射技术
- 应用场景:JDBC · SLF4J . Servlet容器初始化·等等…
源码连接:https://gitee.com/yuehewei/java-spi.git
学习播主:https://www.bilibili.com/video/BV1RY4y1v7mN
只是整理视频的笔记;