介绍Java中的SPI(Service Provider Interface)机制,它是一种服务发现和扩展的框架,常用于实现模块化和插件化的设计。
chou403
/ Javabase
/ c:
/ u:
/ 2 min read
Java SPI
SPI: Service Provider Interface,它是从 Java6 开始引入的,是一种基于 Classloader 来发现并加载服务的机制。
一个标准的 SPI,由三个组件构成,分别是:
- Service: 是一个公开的接口或抽象类,定义了一个抽象的功能模块
- Service Provider: 是 Service 接口的一个实现类
- ServiceLoader: 是 SPI 机制中的核心组件,负责在运行时发现并加载 Service Provider
运行流程
三大规范要素
- 规范的配置文件
- 文件路径: 必须在 jar 包中 META-INF/services 目录下
- 文件名称: Service 接口的全限定名
- 文件内容: Service 实现类的全限定名。如果有多个实现类,那么每一个实现类中单独占据一行
- Service Provider 类必须具备无参的默认构造方法
- Service 接口的实现类,即 Service Provider 类,必须具备无参的默认构造方法。因为随后通过反射技术实例化它时,是不带参数的
- 保证能加载到配置文件和 Service Provider 类
- 方式一: 将 Service Provider 的 jar 包放到 classpath 中
- 方式二: 将 jar 包安装到 jre 的扩展目录中
- 方式三: 自定义一个 ClassLoader
Java SPI 与 SpringBoot 自动配置
该如何实现 Auto-Configuration
- 首先,不能脱离 springboot 框架另起炉灶
- 继续使用@Configuration 等已有注解
- 第二,对用户友好,将”全自动”贯彻到底
- 参考 Java SPI 的设计思想