在Java8中,java.sql.DriverManger类中有一个静态块,如
static {
loadInitialDrivers();
println("JDBC DriverManager initialized");
}它将在java.sql.DriverManger类由ClassLoader加载时执行,并将调用ServiceLoader.load()方法开始扫描类路径下jars中META/services文件夹下的文件。通过这种方式,它注册了服务文件夹中定义的所有驱动程序类。
但是,在Java11中,它不再有这个静态块了,我想知道Java11是如何启动SPI进程的。谢谢你的回答。
发布于 2022-03-09 21:17:05
在Java 11中,只有在打开第一个连接时才开始扫描驱动程序:
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类有效地加载驱动程序:
private static void ensureDriversInitialized() {
// [..]
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
// [..]
}https://stackoverflow.com/questions/71415607
复制相似问题