SPI (Service Provider Interface) 作为 Spring 系列一项至关重要的技术,在源码中有着众多的使用场景,对于我们自己编写各类 starter,也有很大的借鉴作用。下面我们将通过阅读源码的方式,带大家了解和运用 SPI 的相关技术。
1. 什么是 SPI
了解过 JDBC 的小伙伴都知道,Java 原本有一套自己的 SPI加载机制,例如通过加载 META-INF/services/
下的各类数据库 Driver,能够在定义了一系列接口的情况下,屏蔽不同数据库的细节,以此实现代码不变,通过配置文件任意切换数据库的功能。
Spring 中的 SPI 其实也运用了相同的思想。通过定义接口规范,Spring 可以将需要的实现类全部载入并实例化。这一点在各类 spring 组件中运用十分广泛。
以 spring-boot-autoconfigure
包为例,在它的配置文件 META-INF/spring.factories
中,定义了一系列接口和实现类,在 spring 启动时,就能通过该配置文件,获取到所有在此定义的实现类的全限定名并实例化。
2. SPI 在 Springboot 的使用举例
下面我们以 springboot 启动流程中,第一个出现 SPI 的地方为例。