SPI 全称是 Service Provider Interface, 原本是JDK内置的一种服务发现机制,它主要是用来做服务的扩展实现。
应用场景SPI在很多场景中都有使用,比如数据库连接,JDK提供的java.sql.Driver接口,这个接口的实现在jdk中并没有实现,而是由不同厂商来实现,比如oracle、mysql等,这些数据库驱动都会实现这个接口,然后jdk利用spi机制从classpath下找到相应的驱动来获得指定的数据库的连接。这种插拔式的扩展加载方式,遵循一定的约定:
所有的扩展点必须要放在resources/meta-INF/services目录下,SPI机制默认会扫描这个路径下的属性文件以完成加载。
实操使用package com.luoq.spi;
public interface Driver{
String connect();
}
package com.luoq.spi.impl;
public class MysqlDriver implements Driver{
@Override
public String connect(){
return "连接Mysql"
}
}
在resources/meta-INF/services目录下创建一个以Driver接口全路径命名的文件com.luoq.spi.Driver,在里面填写接口的实现类:
com.luoq.spi.impl.MysqlDriver
创建一个测试类进行测试
import java.util.ServerLoader;
public class TestMain{
public static void main(String[] args){
ServiceLoader serviceLoader = ServiceLoader.load(Driver.class);
serviceLoader.forEach(driver -> System.out.println(driver.connect()));
}
}



