springboot DataSource
springboot提供了很多的自動配置,借助其內部的實現機制,我們在使用一些模塊時只需要簡單的依賴引入即可實現相關功能的注入與切換。在web開發過程中,與數據庫經常會有聯系,同樣在springboot中對數據源(DataSource)也提供了相應的處理流程來方便開發者。下面會從幾個方面做簡單的說明,作為學習的記錄:
- 說明
此次分析的springboot版本為?2.2.0.RELEASE,不同版本在一些方面會存在一定的差異,比如現在在默認的數據源為hikari。
- 簡介
此版本中內置了3個數據源的創建邏輯,分別為:
com.zaxxer.hikari.HikariDataSource, org.apache.tomcat.jdbc.pool.DataSource org.apache.commons.dbcp2.BasicDataSource- 源碼
想知道springboot自動配置的入口,無疑需要從spring-boot-autoconfigure/META-INF/spring.factories開始,搜索下關鍵字DataSource,可以 看到引入了 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,那么這就是數據源自動配置。
@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...}相對與其他模塊,代碼非常的少,我們可以關注兩點,一是@Import,二是里面的內容,
一般情況我們用的比較多的是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 {}可以看到,這里定義了之前說到的幾種數據源配置,以Hikari為例,看下創建過程:
@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());}可見,最終的創建過程都是在DataSourceBuilder#build中完成。
- 分析
上面說到,在DataSourceBuilder中完成了DataSource的創建工作,但是此時的數據源只有基礎的一些參數,比如url、driverClass等,在使用數據庫連接池時,絕非這么些參數,此時是如何配置進去的?
回到剛Hikari的配置上,
@Bean @ConfigurationProperties(prefix = "spring.datasource.hikari")同時結合application.properties中的配置,發現會有spring.datasource.xxx與spring.datasource.hikari.xxx,其區別在于使用前者時,會根據基礎的參數創建數據源,但是在DataSource的生命周期中,會將后者的值注入到DataSource bean中從而完成DataSource的屬性注入,那么上面說到的連接池相關的配置,也是從這里加進去的。
所有我們在配置數據源時,不要使用spring.datasource.xxx,否則數據庫連接池將會使用默認的配置。
- 示例
下面以阿里的druid數據源為例,
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();} }?
總結
以上是生活随笔為你收集整理的springboot DataSource的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何获得onblur中的值,从onBlu
- 下一篇: 详解 masm + textpad 编译