美文网首页
JDBC中SPI机制梳理

JDBC中SPI机制梳理

作者: _小毛驴 | 来源:发表于2021-01-26 13:56 被阅读0次

    运行环境: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之后,加载流程就变成了这样的了。

    image.png

    所以,按照当前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

    相关文章

      网友评论

          本文标题:JDBC中SPI机制梳理

          本文链接:https://www.haomeiwen.com/subject/dcxgzktx.html