什么是SPI?
SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
在Dubbo、JDBC中都使用到了SPI机制,java就是通过 ServiceLoader.load() 方法获取到实现类的实例的,达到调用外部服务接口的目的。
简单看看在JDBC是如何实现SPI服务的。
JDBC
连接准备
String url = "jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL";
String username = "root";
String password = "root";
String driverClassName = "com.mysql.cj.jdbc.Driver";
Class.forName(driverClassName);
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println(connection);
加载
在DriverManager类中可以看见有一个 loadInitialDrivers() ,这个方法就是查找Driver接口的服务类,所以它的文件路径就是:META-INF/services/java.sql.Driver。
public class DriverManager {
private static void loadInitialDrivers() {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run(