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);
// [..]
}
在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);
// [..]
}