DruidDataSource智能匹配Driver原理

来源:互联网 发布:熊猫tv mac客户端 编辑:程序博客网 时间:2024/06/03 08:57

今天在复习Spring整合Mybatis的时候,在编写例子期间,比较了主流的三种数据库连接池(dbcp、c3p0和druid)的数据源配置,发现在druid的配置中不需要声明使用的是哪个数据库驱动Driver。
以下是Spring的数据源的配置:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">        <property name="url" value="jdbc:h2:~/test" />        <property name="username" value="sa"/>         <property name="password" value=""/> </bean>

在对com.alibaba.druid.pool.DruidDataSource进行断点调试之后,发现:

PS:参考的druid源码版本是1.0.9

  1. 数据库的基本配置其实是在com.alibaba.druid.pool.DruidDataSource的父类com.alibaba.druid.pool.DruidAbstractDataSource中的属性。
  2. 可以通过driverClass属性显式配置数据库驱动类(要使用全限定类型)
  3. 在com.alibaba.druid.pool.DruidDataSource的init()方法中:
public void init(){    //省略部分不相关的代码    ...    if (this.driver == null) {        if (this.driverClass == null || this.driverClass.isEmpty()) {                this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl);        }        if (MockDriver.class.getName().equals(driverClass)) {            driver = MockDriver.instance;        } else {            driver = JdbcUtils.createDriver(driverClassLoader, driverClass);        }    } else {        if (this.driverClass == null) {            this.driverClass = driver.getClass().getName();        }    }    ...}

在这个方法中,Druid是通过使用com.alibaba.druid.util.JdbcUtils的getDriverClassName()方法通过url去获取到对应的数据驱动类的全限定名。

PS:JdbcUtils的getDriverClassName()方法一大堆if else

原创粉丝点击