目录
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的数据源创建成功。