Druid阅读(二)Druid初始化

目录

1 寻找源码入手点

2 开始Druid初始化分析

3 官方文档Spring boot项目中轻松集成Druid数据库连接池和监控


1 寻找源码入手点

如何开始Druid源码的阅读,这不免是个头痛的问题?

呃呃呃...昨天我们已经搭建好了一个基于Spring boot的Druid的demo,那么今天不妨直接基于搭建的示例来瞧瞧如何入手?

启动Spring boot示例项目观察到,如下截图的输出日志,图中的红框处

再看自己工程的Druid配置,用spring.datasource做了一系列的配置(druid相关配置有问题,后面会做说明),然后配置了一个

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

如以下截图所示:

再看pom.xml引入了druid-spring-boot-starter,这个druid就集成进去了。

ok,那么基于这些,不妨就开始先研究下Druid是如何通过这些配置集成Spring boot并初始化相关的配置的。

2 开始Druid初始化分析

Idea快捷键ctrl+shift+f全局搜索关键字Init DruidDataSource,定位到相关的源码位置(如果用关键字未搜索到,请在示例工程里下载Druid的源码后再次搜索),然后打个断点,如下图所示:

然后重新启动示例工程,我们看到断点进来了,且看该方法,是一个DruidDataSourceAutoConfigure的配置类,该方法是在druid-spring-boot-starter提供的,所以在我们pom.xml引入了这个jar包后,那么这个配置类就生效了,在Spring boot启动的时候就会开始加载这个类,就有了我们看到的Init DruidDataSource日志打印了。

接下来我们分析下这个类做了什么事情?

1、@ConditionalOnClass(DruidDataSource.class)注解表示依赖了DruidDataSource这个对象
2、@AutoConfigureBefore(DataSourceAutoConfiguration.class),表明在初始化Druid的配置前会先初始化DataSource的相关配置,而这些配置会从application.properties的以下属性读取:
spring.datasource.url=jdbc:mysql://localhost:3306/shenyu?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver


DataSourceAutoConfiguration源码如下图所示:

 3、

@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})

读取application.properties的以下属性到两个对象中:

spring.datasource.url=jdbc:mysql://localhost:3306/shenyu?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

spring.datasource.initialSize=5
spring.datasource.minIdle=10
spring.datasource.maxActive=20
spring.datasource.maxWait=6000
spring.datasource.timeBetweenEvictionRunsMillis=2000
spring.datasource.minEvictableIdleTimeMillis=600000
spring.datasource.maxEvictableIdleTimeMillis=900000
spring.datasource.validationQuery=select 1
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.keepAlive=true
spring.datasource.phyMaxUseCount=1000
spring.datasource.filters=stat
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

两个对象的源码截图如下所示,一个是读取spring.datasource开头,一个是读取spring.datasource.druid开头,而我的配置里没有这个开头的,有没有问题?先继续往下看先。

 从如下截图可以看到注册了DruidDataSourceWrapper,并且注册的同时会初始化一个init方法

点击DruidDataSourceWrapper对象可以看到它实现了DruidDataSource对象

再看DruidDataSource对象的源码,可以看到会先初始化这个构造函数,然后去读取Druid的配置信息,然后再一看还是读取的spring.datasource.druid开头的配置信息,这里基本就可以确认笔者的Druid的相关配置是有问题了。(主要这种启动没读取到就会用默认值,并不会报错,而往往使用者也并不知道配置有没有生效,这就尴尬了。先留着这个疑问后面源码研究再看。)

 最后则是调用了DruidDataSource对象的init方法,前面提到注册的时候会初始化init方法,而再一看这个方法初始化了各种配置信息,也可以猜想出这就是初始化的核心逻辑了。init方法的部分源码截图如下:

 再看前面示例工程启动后看到的{dataSource-1} inited,也是在init方法的末尾处,初始了相关配置了就会打印处这么一句话,表示Druid的数据源创建成功。

3 官方文档Spring boot项目中轻松集成Druid数据库连接池和监控

可以打开官方文档链接再去看下Spring boot项目集成Druid的正确姿势哈。https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

Guess you like

Origin blog.csdn.net/he_cha_bu/article/details/121218526