一、背景
SPI(service provider interface): 服务供应接口。
服务发现机制。为某个接口寻找服务实现。类似于依赖注入。 适合插件化架构。
二、为什么要有 SPI?
根据子类发现父类或者接口很容易,原生方法支持
java.lang.Class#getSuperclass返回父类java.lang.Class#getInterfaces()返回实现的接口列表
但是根据接口发现实现类很难。总不能去遍历类路径下面的所有 jar 包,找到实现了给定接口的所有实现类,这绝对耗时极长。
java.util.ServiceLoader
这个类就是专门用作服务发现的类。它约定服务提供商要把自己的实现类写在目录META-INF/services下,这样它就会到这里去找对应的服务,也不需要全局去查找了。
三、书写格式
是一个 map 的形式,key 是我们的文件名,value 是文件内容,每个实现类一行
每个接口一个文件。

四、案例
jdk8中java.sql.DriverManager#loadInitialDrivers使用了这种方式来加载驱动:
