运行环境:Windows 10 ;IDEA-2019.3;Tomcat 9.0.24;jdk 1.8.0_221;mybatis-plus 3.4.2;p6spy 3.9.1;
mysql-connector-java 8.0.16;
缘起
在SSM框架中,我打算把Mybatis替换为Mybatis-plus。这个过程还算是简单的。在集成Mybatis-plus的p6spy插件的sql打印的时候,就遇到了问题。
按官方文档,我配置好之后,启动也是没有问题的,但是,一旦访问页面,请求数据库时,就找不到mysql的jdbc驱动了。
按照原理分析,配置了p6spy之后,加载流程就变成了这样的了。
所以,按照当前mybatis-plus的配置,应该是使用了p6spy的URL配置方式,p6spy驱动 主动去发现mysql的驱动,然后做代理。在这个地方,p6spy就出问题了,发现不了mysql驱动。
这里修改为p6spy的datasource配置方式的话,在配置中,我们显式的指明了要被代理的mysql驱动,就不会找不到mysql驱动了。
SPI机制
在折腾上面问题的过程中,遇到了一个拦路虎。那就是SPI机制。
SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
在我看来,有点类似于spring的控制反转。把对象使用和实现拆分开来,达到解耦的目的。
在这里,mysql的jdbc驱动提供了Driver接口的具体实现。数据库连接池在使用DriverManager的过程中,发现Driver的所有实现类。客户端,在实际使用的过程中,就可以直接调用具体的Driver实现,连接数据库了。
示例图如下:
image.png
附录
引用了部分:清幽之地 - https://www.jianshu.com/p/3a3edbcd8f24
网友评论