springboot DataSource
springboot提供了很多的自動配置,借助其內(nèi)部的實現(xiàn)機制,我們在使用一些模塊時只需要簡單的依賴引入即可實現(xiàn)相關(guān)功能的注入與切換。在web開發(fā)過程中,與數(shù)據(jù)庫經(jīng)常會有聯(lián)系,同樣在springboot中對數(shù)據(jù)源(DataSource)也提供了相應(yīng)的處理流程來方便開發(fā)者。下面會從幾個方面做簡單的說明,作為學(xué)習(xí)的記錄:
- 說明
此次分析的springboot版本為?2.2.0.RELEASE,不同版本在一些方面會存在一定的差異,比如現(xiàn)在在默認的數(shù)據(jù)源為hikari。
- 簡介
此版本中內(nèi)置了3個數(shù)據(jù)源的創(chuàng)建邏輯,分別為:
com.zaxxer.hikari.HikariDataSource, org.apache.tomcat.jdbc.pool.DataSource org.apache.commons.dbcp2.BasicDataSource- 源碼
想知道springboot自動配置的入口,無疑需要從spring-boot-autoconfigure/META-INF/spring.factories開始,搜索下關(guān)鍵字DataSource,可以 看到引入了 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,那么這就是數(shù)據(jù)源自動配置。
@Configuration(proxyBeanMethods = false) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class }) public class DataSourceAutoConfiguration {@Configuration(proxyBeanMethods = false)@Conditional(EmbeddedDatabaseCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })@Import(EmbeddedDataSourceConfiguration.class)protected static class EmbeddedDatabaseConfiguration {}@Configuration(proxyBeanMethods = false)@Conditional(PooledDataSourceCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,DataSourceJmxConfiguration.class })protected static class PooledDataSourceConfiguration {}....一些Conditional...}相對與其他模塊,代碼非常的少,我們可以關(guān)注兩點,一是@Import,二是里面的內(nèi)容,
一般情況我們用的比較多的是PooledDataSource:
@Configuration(proxyBeanMethods = false)@Conditional(PooledDataSourceCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,DataSourceJmxConfiguration.class })protected static class PooledDataSourceConfiguration {}可以看到,這里定義了之前說到的幾種數(shù)據(jù)源配置,以Hikari為例,看下創(chuàng)建過程:
@Configuration(proxyBeanMethods = false)@ConditionalOnClass(HikariDataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",matchIfMissing = true)static class Hikari {@Bean@ConfigurationProperties(prefix = "spring.datasource.hikari")HikariDataSource dataSource(DataSourceProperties properties) {HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);if (StringUtils.hasText(properties.getName())) {dataSource.setPoolName(properties.getName());}return dataSource;}} protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {return (T) properties.initializeDataSourceBuilder().type(type).build();} public DataSourceBuilder<?> initializeDataSourceBuilder() {return DataSourceBuilder.create(getClassLoader()).type(getType()).driverClassName(determineDriverClassName()).url(determineUrl()).username(determineUsername()).password(determinePassword());}可見,最終的創(chuàng)建過程都是在DataSourceBuilder#build中完成。
- 分析
上面說到,在DataSourceBuilder中完成了DataSource的創(chuàng)建工作,但是此時的數(shù)據(jù)源只有基礎(chǔ)的一些參數(shù),比如url、driverClass等,在使用數(shù)據(jù)庫連接池時,絕非這么些參數(shù),此時是如何配置進去的?
回到剛Hikari的配置上,
@Bean @ConfigurationProperties(prefix = "spring.datasource.hikari")同時結(jié)合application.properties中的配置,發(fā)現(xiàn)會有spring.datasource.xxx與spring.datasource.hikari.xxx,其區(qū)別在于使用前者時,會根據(jù)基礎(chǔ)的參數(shù)創(chuàng)建數(shù)據(jù)源,但是在DataSource的生命周期中,會將后者的值注入到DataSource bean中從而完成DataSource的屬性注入,那么上面說到的連接池相關(guān)的配置,也是從這里加進去的。
所有我們在配置數(shù)據(jù)源時,不要使用spring.datasource.xxx,否則數(shù)據(jù)庫連接池將會使用默認的配置。
- 示例
下面以阿里的druid數(shù)據(jù)源為例,
1、引入依賴jar
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.18</version> </dependency>2、加入配置
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.druid.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC spring.datasource.druid.username=root spring.datasource.druid.password=123456 spring.datasource.druid.filters=stat spring.datasource.druid.minIdle=53、定義DataSource
@Configuration public class DruidDatasource {@ConfigurationProperties(prefix = "spring.datasource.druid")@Beanpublic DataSource druidDataSource(){return DataSourceBuilder.create().type(DruidDataSource.class).build();} }?
總結(jié)
以上是生活随笔為你收集整理的springboot DataSource的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何获得onblur中的值,从onBlu
- 下一篇: 详解 masm + textpad 编译