欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用springboot通过spi机制加载mysql驱动的过程

程序员文章站 2022-06-30 23:08:15
spi是一种jdk提供的加载插件的灵活机制,分离了接口与实现,就拿常用的数据库驱动来说,我们只需要在spring系统中引入对应的数据库依赖包(比如mysql-connector-java以及针对ora...

spi是一种jdk提供的加载插件的灵活机制,分离了接口与实现,就拿常用的数据库驱动来说,我们只需要在spring系统中引入对应的数据库依赖包(比如mysql-connector-java以及针对oracle的ojdbc6驱动),然后在yml或者properties配置文件中对应的数据源配置就可自动使用对应的sql驱动,

比如mysql的配置:

spi机制正如jdk的classloader一样,你不引用它,它是不会自动加载到jvm的,不是引入了下面的的两个sql驱动依赖就必然会加载oracle以及mysql的驱动:

正是由于jdk的这种spi机制,我们在spring项目中使用对应的驱动才这么简单,

我们只需做两件事:

1、在pom文件中引入对应的驱动依赖

2、在配置文件中配置对应的数据源即可

那么在spring项目中到底是谁触发了数据库驱动的spi加载机制呢?为了说明这个问题,咱们先说说jdk的spi的工作机制,jdk的spi通过serviceloader这个类来完成对应接口实现类的加载工作,就拿咱们要说的数据库驱动来说,

serviceloader会在spring项目的classpath中寻找那些满足下面条件的类:

1、这些jar包的meta-inf/services有一个java.sql.driver的文件

对应java.sql.driver文件中为该数据库驱动对应的数据库驱动的实现类,比如mysql驱动对应的就是com.mysql.cj.jdbc.driver,如下图所示:

使用springboot通过spi机制加载mysql驱动的过程

jdk这部分有关spi具体的实现机制可以阅读下serviceloader的内部类lazyiterator,该类的hasnextservice、nextservice两个方法就是具体spi机制工作底层机制。

好了,上面简要概述了下jdk的spi工作机制,下面继续看spring框架如何使用spi机制来完成数据库驱动的自动管理的(加载、注销),接下来就按照事情发展的先后的先后顺序把mysql驱动加载的全过程屡一下,笔者使用的是springboot 2.x,数据源使用的数据源为hikari,这是后来居上的一款数据源,凭借其优秀的性能以及监控机制成为了springboot 2.x之后首推的数据源,

用过springboot的小伙伴对springboot的自动装载机制,数据源的配置也是使用的自动装配机制,

具体类datasourceautoconfiguration

使用springboot通过spi机制加载mysql驱动的过程

注意上面标红部分,这里面引入的hikari、tomcat等(除了datasourcejmxconfiguration之外)都是一些数据源配置,我们先看下

springboot推荐的hikari数据源配置:

由于在datasourceautoconfiguration类中首先引入的就是hikari的配置,datasource没有创建,满足conditionalonmissingbean以及其他一些条件,就会使用该配置类创建数据源,好了接下来看下createdatasource到底是怎么创建数据源的,

这个过程又是怎么跟spi关联起来的

上面已经来到了drivermanager类,那么drivermanager类里面是否有什么秘密呢,继续往下走,

看下drivermanager的重要方法:

好了,上面已经把springboot如何使用jdk的spi机制来加载数据库驱动的,至于drivermanager的getconnection方法调用过程可以使用类似的方式分析下,在drivermanager的getconnection方法打个断点,当代码停在断点处时,通过idea或者eclipse的堆栈信息就可以看出个大概了。

但愿本文能帮助一些人了解mysql驱动加载的整个过程,加深对spi机制的理解。希望能给大家一个参考,也希望大家多多支持。