使用springboot通过spi机制加载mysql驱动的过程
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,如下图所示:
jdk这部分有关spi具体的实现机制可以阅读下serviceloader的内部类lazyiterator,该类的hasnextservice、nextservice两个方法就是具体spi机制工作底层机制。
好了,上面简要概述了下jdk的spi工作机制,下面继续看spring框架如何使用spi机制来完成数据库驱动的自动管理的(加载、注销),接下来就按照事情发展的先后的先后顺序把mysql驱动加载的全过程屡一下,笔者使用的是springboot 2.x,数据源使用的数据源为hikari,这是后来居上的一款数据源,凭借其优秀的性能以及监控机制成为了springboot 2.x之后首推的数据源,
用过springboot的小伙伴对springboot的自动装载机制,数据源的配置也是使用的自动装配机制,
具体类datasourceautoconfiguration
注意上面标红部分,这里面引入的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机制的理解。希望能给大家一个参考,也希望大家多多支持。