JAVA11 如何使用 SPI 加载 SQL 驱动程序 Class

How JAVA11 use SPI to load SQL Driver Class

在Java8中java.sql.DriverMangerclass中有一个静态块

    static {
        loadInitialDrivers();
        println("JDBC DriverManager initialized");
    }

当java.sql.DriverManger class被ClassLoader加载时执行,会调用ServiceLoader.load()方法开始扫描META-IFO/services文件夹下的文件在 class 路径下的罐子里。通过这种方式,它注册了服务文件夹中定义的所有驱动程序 class。
然而,在Java11中,它不再有这个静态块了,我想知道Java11是如何启动SPI进程的。感谢您的任何回答。

在 Java11 中,仅在打开第一个连接时才开始扫描驱动程序:

DriverManager.getConnection(String url)

public static Connection getConnection(String url)
    throws SQLException {

    java.util.Properties info = new java.util.Properties();
    return (getConnection(url, info, Reflection.getCallerClass()));
}

调用 DriverManager.getConnection(String url, Properties info, Class<?> caller):

private static Connection getConnection(
    String url, java.util.Properties info, Class<?> caller) throws SQLException {
    // [..]
    ensureDriversInitialized();
    // [..]
}

依次调用 DriverManager.ensureDriversInitialized() 最终使用 java.util.ServiceLoader class 有效加载驱动程序:

private static void ensureDriversInitialized() {
    // [..]
                    ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
    // [..]
}