mysql驱动为什么自动加载_JDBC自动加载驱动的SPI机制

本人试验无意间发现,只要前面pom引入了mysql-connector-java这个包,什么都不写也会加载mysql数据库驱动, (当然如果不引入mysql-connector-java这个包是不行的)这是为什么呢?

一 为什么java不加载驱动可以

源码包里DriverManager类上面说明了,不加载也可以的注释。

*

Applications no longer need to explicitly load JDBC drivers using Class.forName(). Existing programs* which currently load JDBC drivers using Class.forName() will continueto work without* modification.

翻译过来:

*

应用程序不再需要使用 Class.forName() code>显式加载JDBC驱动程序。 现有程序

* 当前使用 Class.forName() code>加载JDBC驱动程序将继续工作而无需

* 修改。

原来在新版本的JDBC中不用在通过Class.forName()来显示加载JDBC驱动,那到底是怎么实现的呢,我们来看下源码。

二 源码分析

下面是引入的mysql-connector-java包

mysql

mysql-connector-java

8.0.11

public static voidinsertData() {private String URL = "jdbc:mysql://localhost:port/databaseName?useUnicode=true&characterEncoding=UTF-8";private String USER = "xx";private String PASSWORD = "xx";//1 加载数据库驱动

Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //2 获取链接connection

PreparedStatement preparedStatement = connection.prepareStatement("insert into test (name, sex) values (?,?)"); //3 通过statement对象执行sql

preparedStatement.setString(1, "xx");

preparedStatement.setString(2, "yy");

Boolean result= preparedStatement.execute(); //4 获取返回结果

}

启动服务后,执行静态方法DriverManager.getConnection 因为需要加载DriverManager类,所以执行static静态代码块。

10247de8185dfb5c31bcd26e603262fe.png

0d66ed87a263a24db70ebe5ae59a3eca.png

7d7344c66d6779843ed80a1300afd0ef.png

在java这头定义了一个Driver接口,ServiceLoader loadedDrivers = ServiceLoader.load(Driver.class),那么ServiceLoader.load()方法是干什么的呢?

在ServiceLoader.load时,根据传入的接口类,遍历META-INF/services目录下的以该类命名的文件中的所有类,并实例化返回。ServiceLoader是spi机制的一个实现

具体可以参加ServiceLoader类的源代码如下图,PREIX是META-INF/services,service.getName是接口Driver的类名称,拼接出文件路径:

239968c8e4a9b2472549efa02e67aa79.png

拼出的全路径fullName是:META-INF/services/java.sql.Driver,然后去本地找到该路径下的这个文件,然后把这个文件加载进来,这个文件的内容如下

e7467508b1aaa32d52155d757be21da2.png

文件内容是:com.mysql.cj.jdbc.Driver,这个类就是mysql厂商提供的驱动里面的Driver实现类,然后对其进行初始化加载,进行实例化,调这个类的static静态块,执行注册驱动。

b197307c5d69ddd38e54d2952b8e48ea.png

三 SPI机制总结

ServiceLoader是SPI的是一种实现,SPI,全称Service Provider Interface,用于一些服务提供给第三方实现或者扩展,可以增强框架的扩展或者替换一些组件。 通过jar包来实现扩展功能的热插拔。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值