🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### SPI(Service Provider Interface) SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件 Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制,在JDK中提供了工具类:“java.util.ServiceLoader”来实现服务查找 ![](https://img.kancloud.cn/bb/1b/bb1b74725434e544f564621bfa4b6ae8_800x266.png) 常见使用场景: JDBC、日志门面接口、Spring、SpringBoot相关starter组件、Dubbo、JNDI等 > SPI的接口是Java核心库的一部分,是由**启动类加载器(Bootstrap Classloader)来加载的;SPI的实现类是由系统类加载器(System ClassLoader)**来加载的。启动类加载器是无法找到 SPI 的实现类的,因为依照双亲委派模型,BootstrapClassloader无法委派AppClassLoader来加载类。于是加载SPI实现类的重任就落到了线程上下文类加载器的身上(破坏了“双亲委派模型”,可以在执行线程中抛弃双亲委派加载链模式,使程序可以逆向使用类加载器);通俗的讲就是JDK提供了一种帮助第三方实现者加载服务(如数据库驱动、日志库)的便捷方式,只要第三方遵循约定(把类名写在/META-INF/services里),当服务启动时就会去扫描所有jar包里符合约定的类名,再调用forName加载,由于启动类加载器没法加载实现类,就把加载它的任务交给了线程上下文类加载器 ***** 【参考资料】 [https://segmentfault.com/a/1190000020422160](https://segmentfault.com/a/1190000020422160)