天天看点

Java SPI机制一、定义二、具体操作三、实际案例

一、定义

SPI:Service Provider Interface

服务提供者接口

他是由第一方系统提供给第三方服务提供者的服务接口,是对不同的第三方实现方案的规范和约定,能够让同一组件不同实现达到可拔插的效果,让不同组件协调工作。

谁提供SPI接口通常没有限制,往往是开发的软件可支持扩展时,就可以制定SPI接口。

二、具体操作

1、Java SPI规范

服务提供者需在jar包的META-INF/services/目录下创建一个以SPI定义的接口名为文件名的文件,文件内容为SPI接口实现类的全类名。

以mysql驱动为例:

Java SPI机制一、定义二、具体操作三、实际案例

文件内容为:

Java SPI机制一、定义二、具体操作三、实际案例

其中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做了封装