首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVA11如何使用SPI加载SQL驱动程序类

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

Stack Overflow用户
提问于 2022-03-09 20:26:46
回答 1查看 84关注 0票数 0

在Java8中,java.sql.DriverManger类中有一个静态块,如

代码语言:javascript
复制
    static {
        loadInitialDrivers();
        println("JDBC DriverManager initialized");
    }

它将在java.sql.DriverManger类由ClassLoader加载时执行,并将调用ServiceLoader.load()方法开始扫描类路径下jars中META/services文件夹下的文件。通过这种方式,它注册了服务文件夹中定义的所有驱动程序类。

但是,在Java11中,它不再有这个静态块了,我想知道Java11是如何启动SPI进程的。谢谢你的回答。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-09 21:17:05

在Java 11中,只有在打开第一个连接时才开始扫描驱动程序:

DriverManager.getConnection(String url)

代码语言:javascript
复制
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)

代码语言:javascript
复制
private static Connection getConnection(
    String url, java.util.Properties info, Class<?> caller) throws SQLException {
    // [..]
    ensureDriversInitialized();
    // [..]
}

然后调用DriverManager.ensureDriversInitialized(),它最终使用java.util.ServiceLoader类有效地加载驱动程序:

代码语言:javascript
复制
private static void ensureDriversInitialized() {
    // [..]
                    ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
    // [..]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71415607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档