https://baijiahao.baidu.com/s?id=1741487899011254388&wfr=spider&for=pc
定义
SPI英文全称为Service Provider Interface,是JDK提供的一套用于帮助使用第三方实现的技术工具。表现为JAVA应用层实现服务接口,第三方实现接口,然后通过SPI的方式实现服务调用。
SPI与接口的区别
接口我们通常是应用开发者自己定义,自己实现的一种做法。如果有多种实现,在使用方调用时,还需要我们的应用开发方指定具体的实现接口。
SPI是应用开发者仅仅定义接口,具体实现由第三方开发者甚至使用方来实现,仅需要将实现代码打包部署到开发者应用下并简单配置即可,若后续变更实现,仅需替换部署包和配置,无需修改应用代码的一种非常灵活的符合开闭原则的实践方式。常见的SPI例子是数据库驱动、日志框架的引入。
说明:java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "123456");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from Users");
https://www.cnblogs.com/frankcui/p/13407458.html
public class Test {
public static void main(String[] args) {
Iterator<SPIService> providers = Service.providers(SPIService.class);
ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class);
while(providers.hasNext()) {
SPIService ser = providers.next();
ser.execute();
}
System.out.println("--------------------------------");
Iterator<SPIService> iterator = load.iterator();
while(iterator.hasNext()) {
SPIService ser = iterator.next();
ser.execute();
}
}
}