SPI(Service Provider Interface,服务提供者接口)是 JDK 内置的一种服务发现机制:由接口定义方约定契约,由第三方实现方提供实现,运行期再由
java.util.ServiceLoader动态发现并加载实现类。它的核心价值是解耦——调用方只依赖接口,不需要在编译期知道具体实现。
1. 为什么需要 SPI
在没有 SPI 的朴素做法里,调用方如果要切换实现,往往要改代码:直接 new 某个实现类,或者 Class.forName("com.xxx.MyImpl") 写死全限定名,又或者维护一个工厂类把 if/else 写满。这几种方式都把“用哪个实现”这个决定固化在了调用方的源码里,一旦引入新实现(比如换数据库、换日志组件),就要重新编译。