SPI

2025/04/05

一、背景

SPI(service provider interface): 服务供应接口。

服务发现机制。为某个接口寻找服务实现。类似于依赖注入。 适合插件化架构。

二、为什么要有 SPI?

根据子类发现父类或者接口很容易,原生方法支持

但是根据接口发现实现类很难。总不能去遍历类路径下面的所有 jar 包,找到实现了给定接口的所有实现类,这绝对耗时极长。

java.util.ServiceLoader

这个类就是专门用作服务发现的类。它约定服务提供商要把自己的实现类写在目录META-INF/services下,这样它就会到这里去找对应的服务,也不需要全局去查找了。

三、书写格式

是一个 map 的形式,key 是我们的文件名,value 是文件内容,每个实现类一行

每个接口一个文件。

四、案例

jdk8java.sql.DriverManager#loadInitialDrivers使用了这种方式来加载驱动: