如果不做任何的设置,Java 应用的线程的上下文类加载器默认就是 AppClassLoader 。在核心类库使用 SPI 接口时,传递的类加载器使用线程上下文类加载器,就可以成功的加载到 SPI 实现的类 。线程上下文类加载器在很多 SPI 的实现中都会用到 。
通常可以通过Thread.currentThread().getClassLoader()和 Thread.currentThread().getContextClassLoader() 获取线程上下文类加载器 。
3.4 Java SPI 的不足Java SPI 存在一些不足:
- 不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现 。如果不想用某些实现类,或者某些类实例化很耗时,它也被载入并实例化了,这就造成了浪费 。
- 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类 。
- 多个并发多线程使用 ServiceLoader 类的实例是不安全的 。
- TimeZoneNameProvider: 为 TimeZone 类提供本地化的时区名称 。
- DateFormatProvider: 为指定的语言环境提供日期和时间格式 。
- NumberFormatProvider: 为 NumberFormat 类提供货币、整数和百分比值 。
- Driver: 从 4.0 版开始,JDBC API 支持 SPI 模式 。旧版本使用 Class.forName() 方法加载驱动程序 。
- 【源码级深度理解 Java SPI】PersistenceProvider: 提供 JPA API 的实现 。
- 等等
4.1 SPI 应用案例之 JDBC DriverManager作为 Java 工程师,尤其是 CRUD 工程师,相必都非常熟悉 JDBC 。众所周知,关系型数据库有很多种,如:MySQL、Oracle、PostgreSQL 等等 。JDBC 如何识别各种数据库的驱动呢?
4.1.1 创建数据库连接我们先回顾一下,JDBC 如何创建数据库连接的呢?
在 JDBC4.0 之前,连接数据库的时候,通常会用 Class.forName(XXX) 方法来加载数据库相应的驱动,然后再获取数据库连接,继而进行 CRUD 等操作 。
Class.forName("com.mysql.jdbc.Driver")而 JDBC4.0 之后,不再需要用Class.forName(XXX) 方法来加载数据库驱动,直接获取连接就可以了 。显然,这种方式很方便,但是如何做到的呢?
(1)JDBC 接口:首先,Java 中内置了接口 java.sql.Driver 。
(2)JDBC 接口实现:各个数据库的驱动自行实现 java.sql.Driver 接口,用于管理数据库连接 。
- MySQL:在 MySQL的 Java 驱动包 mysql-connector-java-XXX.jar 中,可以找到 META-INF/services 目录,该目录下会有一个名字为java.sql.Driver 的文件,文件内容是com.mysql.cj.jdbc.Driver 。

文章插图
- PostgreSQL 实现:在 PostgreSQL 的 Java 驱动包 postgresql-42.0.0.jar 中,也可以找到同样的配置文件,文件内容是 org.postgresql.Driver,org.postgresql.Driver 正是 PostgreSQL 版的 java.sql.Driver 实现 。
以 MySQL 为例,创建数据库连接代码如下:
final String DB_URL = String.format("jdbc:mysql://%s:%s/%s", DB_HOST, DB_PORT, DB_SCHEMA);connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);4.1.2 DriverManager从前文,我们已经知道 DriverManager 是创建数据库连接的关键 。它究竟是如何工作的呢?
可以看到是加载实例化驱动的,接着看 loadInitialDrivers 方法:
经验总结扩展阅读
- 10月28日3时42分新疆阿克苏地区沙雅县发生3.0级地震
- 10月28日4时34分新疆阿克苏地区温宿县发生3.0级地震
- 今年第22号台风“尼格”最强可达台风级 30日傍晚前后进入南海海面
- 红米note9pro评测最新_红米note9pro深度测评
- 空调一级能效与三级能效的区别是什么
- iOS 16.3.1正式版续航怎么样 iOS 16.3.1升级建议
- ipx7和ip68哪个更防水 哪个防水等级更高
- 10月28日今起三天陕西持续阴雨模式局地阵风6级 风寒效应明显需保暖
- EasyPoi大数据导入导出百万级实例
- Dubbo-聊聊通信模块设计