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

作者:PolarisHuster 时间:2024-01-27 09:12:26 

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

比如mysql的配置:


spring:
 datasource:
   url: jdbc:mysql://localhost:3306/xxxxx?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
   username: dev
   password: xxxxxx
   platform: mysql

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


       <!--oracle驱动-->
       <dependency>
           <groupId>com.oracle</groupId>
           <artifactId>ojdbc6</artifactId>
           <version>12.1.0.1-atlassian-hosted</version>
       </dependency>

<!--mysql驱动-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <scope>runtime</scope>
       </dependency>

正是由于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机制工作底层机制。

来源:https://jonhuster.blog.csdn.net/article/details/104394196

标签:springboot,spi机制,mysql驱动
0
投稿

猜你喜欢

  • php出现Cannot modify header information问题的解决方法大全

    2024-05-02 17:35:21
  • Windows下Python2与Python3两个版本共存的方法详解

    2022-01-16 12:27:29
  • Python实现多线程抓取妹子图

    2022-10-02 15:39:25
  • JavaScript中const、var和let区别浅析

    2024-05-09 15:03:15
  • Golang之defer 延迟调用操作

    2023-08-04 18:21:48
  • 关于Tensorflow中的tf.train.batch函数的使用

    2023-11-04 19:49:54
  • ASP中数据库调用中常见错误的现象和解决

    2007-09-20 13:24:00
  • MySQL如何优化查询速度

    2024-01-17 05:38:04
  • 详解python项目实战:模拟登陆CSDN

    2023-02-09 01:53:34
  • PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】

    2023-11-15 01:31:13
  • 获取MSSQL数据字典的SQL语句

    2024-01-20 11:35:16
  • 使用virtualenv创建Python环境及PyQT5环境配置的方法

    2022-12-30 06:09:26
  • Mysql全局ID生成方法

    2023-07-02 13:59:53
  • JS和JQuery实现雪花飘落效果

    2024-04-18 09:51:42
  • Django中和时区相关的安全问题详解

    2021-02-24 11:40:44
  • keras分类模型中的输入数据与标签的维度实例

    2022-01-30 02:12:43
  • 用python 实现在不确定行数情况下多行输入方法

    2021-11-08 05:53:27
  • 10款最好的Web开发的 Python 框架

    2023-12-21 11:26:04
  • Python基于wordcloud及jieba实现中国地图词云图

    2021-03-31 15:08:53
  • ASPError(err)对象的相关基础知识

    2008-03-24 20:23:00
  • asp之家 网络编程 m.aspxhome.com