一、定义
SPI:Service Provider Interface
服务提供者接口
他是由第一方系统提供给第三方服务提供者的服务接口,是对不同的第三方实现方案的规范和约定,能够让同一组件不同实现达到可拔插的效果,让不同组件协调工作。
谁提供SPI接口通常没有限制,往往是开发的软件可支持扩展时,就可以制定SPI接口。
二、具体操作
1、Java SPI规范
服务提供者需在jar包的META-INF/services/目录下创建一个以SPI定义的接口名为文件名的文件,文件内容为SPI接口实现类的全类名。
以mysql驱动为例:
文件内容为:
其中java.sql.Driver为Java定义的数据库驱动SPI接口,com.mysql.cj.jdbc.Driver是第三方服务提供者(Mysql)提供的具体实现。
2、Java SPI实现
Java关于SPI实现的源码在这个类中:
java.util.ServiceLoader
具体逻辑可自行阅读
三、实际案例
1、JDBC加载不同数据库厂商的连接驱动
2、SLF4J提供的对不同日志实现(log4j、logback)的支持
3、Spring为了支持扩展大量使用了SPI,如:对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等
4、Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对java提供的原生SPI做了封装