SpringBoot底層-數據源自動配置類

SpringBoot默認使用Hikari連接池,當我們想要切換成Druid連接池,底層原理是怎樣呢

SpringBoot默認連接池——Hikari

spring-boot-autoconfiguration包內有一個DataSourceConfiguraion配置類

abstract class DataSourceConfiguration {@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;}}
}
  • @ConditionalOnClass(HikariDataSource.class)Hikari包會自動導入,這個條件默認滿足
  • @ConditionalOnMissingBean(DataSource.class)當不存在DataSource類型的Bean,這個條件為后續切換到Druid連接池做鋪墊
  • @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)中的matchIfMissing = true是重點,表示假如配置項沒有這個配置spring.datasource.type=com.zaxxer.hikari.HikariDataSource,也滿足這個條件

所以當spring.datasource.type沒有被配置的時候,SpringBoot的自動配置會默認使用Hikari連接池

切換到Druid連接池

當我們在maven中引入druid-spring-boot-starter依賴的時候,就會有DruidDataSourceAutoConfigure配置類

@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
public class DruidDataSourceAutoConfigure {@ConditionalOnMissingBeanpublic DataSource dataSource() {return new DruidDataSourceWrapper();}
}class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {}
  • @ConditionalOnClass({DruidDataSource.class})導入DruidDataSource類,默認滿足條件
  • @AutoConfigureBefore({DataSourceAutoConfiguration.class})這個是切換數據源的核心,表示在DataSourceAutoConfiguration配置類前自動裝配,所以Druid連接池配置類優先于SpringBoot默認的數據源配置類DataSourceConfiguraion自動裝配。

DruidDataSourceAutoConfigure 在自動裝配時會實例化一個數據源對象DruidDataSourceWrapper,該對象的部分繼承和實現關系是
DruidDataSourceWrapper與DataSource之間的關系
可以看到DruidDataSourceWrapper實際上實現了DataSource接口,此時Spring容器內有一個DateSource類型的Bean。
回顧上面Hikari連接池的條件,此時@ConditionalOnMissingBean(DataSource.class)條件就不成立了,所以Hikari連接池就不會被實例化

總結

我們在IDEA里啟動SpringBoot的控制臺中也通過日志觀察此時的數據源是否切換成了Druid

SpringBoot日志

SpringBoot 2和SpringBoot 3的依賴區別

SpringBoot 2需引入的druid依賴為druid-spring-boot-starter
SpringBoot 3需引入的druid依賴為druid-spring-boot-3-starter

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76966.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試算法高頻03-遞歸

認識遞歸 遞歸的概念與特性:遞歸本質類似循環,是通過函數體進行的循環操作。借助電影《盜夢空間》類比,遞歸如同主角在不同夢境層穿梭,向下進入不同遞歸層,向上能回到原來一層,每一層環境和周圍元素相似&a…

linux Gitkraken 破解

ubuntu 安裝 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客

設計模式簡述(十一)裝飾器模式

裝飾器模式 描述基本使用使用 描述 裝飾器模式是一種功能型模式 用于動態增強對象的功能 這么一說感覺上和代理模式有些類似 抽象裝飾器 要實現原有業務接口,并注入原有業務對象 至于對原有業務對象的調用,可以采用private業務對象 實現業務接口方法的…

【NetCore】ControllerBase:ASP.NET Core 中的基石類

ControllerBase:ASP.NET Core 中的基石類 一、什么是 ControllerBase?二、ControllerBase 的主要功能三、ControllerBase 的常用屬性四、ControllerBase 的常用方法2. 模型綁定與驗證3. 依賴注入五、ControllerBase 與 Controller 的區別六、實際開發中的最佳實踐七、總結在 …

DE2-115分秒計數器

一、模塊設計 如若不清楚怎么模塊化,請看https://blog.csdn.net/szyugly/article/details/146379170?spm1001.2014.3001.5501 1.1頂層模塊 module top_counter(input wire CLOCK_50, // 50MHz時鐘input wire KEY0, // 暫停/繼續按鍵out…

ubuntu git cola gui

直接的方法, samba, win 里用 tortoiseSVN 需要先在命令行,運行 git 命令,看到操作提示, 按照提示做 然后右鍵看 git diff 其它的方法 linux下可視化git工具git-cola安裝與使用(HTTP方式)_git…

每日一題(小白)回溯篇4

深度優先搜索題:找到最長的路徑,計算這樣的路徑有多少條(使用回溯) 分析題意可以得知,每次向前后左右走一步,直至走完16步就算一條走通路徑。要求條件是不能超出4*4的范圍,不能重復之前的路徑。…

【數據分享】2000—2020年我國250m精度灌溉農田柵格數據(免費獲取)

灌溉農田是指通過水利灌溉為農作物提供必要水分,以維持其生長需求的農田類型。灌溉農田占全球農田的20%,占全球糧食產量的40%。但其消耗了60%-70%的淡水和80%-90%的消耗性用水量。中國是世界上灌溉面積最大的農業大國,但中國僅占世界上8%的農…

MySQL-SQL-DML語句、INSER添加數據、UPDATE更新數據、DELETE刪除數據

一. DML 1. DML的英文全稱是Data Manipulation Language(數據操作語言),用來對數據庫中表的數據記錄進行增、刪、改操作。 2. 添加數據(INSERT);修改數據(UPDATE);刪除數據(DELETE) 二. DML-INSER添加數據 -- DML insert -- 指定字段添加數…

使用SymPy求解矩陣微分方程

引言 在數學、物理、工程等領域,微分方程常常被用來描述系統的變化和動態過程。對于多變量系統或者多方程系統,矩陣微分方程是非常常見的,它可以用來描述如電路、控制系統、振動系統等復雜的動態行為。今天,我們將通過Python 中的 SymPy 庫來求解矩陣微分方程,幫助大家輕…

Sentinel實戰(五)、系統保護規則、限流后統一處理及sentinel持久化配置

Spring Cloud Alibaba-Sentinel實戰(五)、系統保護規則、限流后統一處理及sentinel持久化配置 一、系統保護規則一)、系統規則支持的模式二)、新增系統規則界面三)、demo測試二、限流后統一處理實操demo三、sentinel持久化配一、系統保護規則 系統保護規則是從應用級別的…

【百日精通JAVA | SQL篇 | 第四篇】約束

SQL這一塊沒什么難度,主要是一個熟練度,稍微上點難度的地方,其實在于查,比較復雜,涉及到很多問題。 指定列插入 使用指定列插入的時候,未被指定的列使用默認值進行存儲,默認值為空。 默認值設置…

http協議版本的區別 -- 2和3

目錄 http2和http3的區別 傳輸層協議 QUIC協議 介紹 連接建立與握手 建立安全連接的過程 RTT 建連為什么需要兩個過程 原因 解決 QUIC協議的1-RTT 建連 必要性 連接過程 第一次握手(Client Hello) 版本號 key_share 其他 第二次握手 介紹 Server Hello 身…

21 天 Python 計劃:MySQL 庫相關操作

文章目錄 前言一、系統數據庫1. information_schema2. performance_schema3. mysql4. test 二、創建數據庫1. 語法2. 數據庫命名規則 三、數據庫相關操作1. 查看數據庫2. 選擇數據庫3. 刪除數據庫4. 修改數據庫 總結 前言 Python是一種強大且易于學習的編程語言。通過這個21天的…

手撕LLM(二):從源碼出發,探索LoRA加載、推理全流程

接上回接著說,前面我們通過分析源碼,了解了大模型推理的詳細流程,包括提示詞從輸入,到對話模版包裝,到tokenID轉換,到Embedding詞向量轉換;通過大模型推理,再將大模型輸出進行最后一…

WPS宏開發手冊——常見問題

目錄 系列文章6、常見問題 系列文章 使用、工程、模塊介紹 JSA語法 JSA語法練習題 Excel常用Api Excel實戰 常見問題 附錄 6、常見問題 6.1、編輯完宏后會自動保存,下次打開文件會提醒是否啟用宏,點擊啟用會自動加載上次編輯的…

【Android安卓移動計算】實現項目一[模擬器啟動項目]

文章目錄 新建項目項目結構介紹說明程序自動生成:圖片和樣式文件夾:Training1\app\src\main\res\drawable布局文件文件夾:Training1\app\src\main\res\layoutJava文件夾:Training1\app\src\main\java\com\example\training1Androi…

快 速 冪

暴力肯定會超時 3^10 9^5 9*9^4 9*81^2 9*18^2^1 先對b判斷奇偶 偶數:對b/2,對a平方 奇數:先*a,再對a平方,b/2 取余注意:(3^10)%k( 9 * 18^2^1)%k(( 9%k )%k * (18^2^1)%k)%k

網絡釣魚攻擊的威脅和執法部門的作用(第二部分)

執法部門在打擊網絡釣魚中的作用 雖然網絡釣魚可能始于一封欺騙性的電子郵件或短信,但其后果可能遠遠超出個人收件箱的范圍,影響企業、經濟甚至國家安全。隨著網絡釣魚攻擊的規模和復雜性不斷增加,執法機構站在前線,努力預防、調…

Data_Socket和UDP_Socket

Data_Socket 和 UDP_Socket 是兩種不同類型的網絡套接字,它們用于不同的協議和應用場景。以下是它們的主要區別: 協議類型: UDP_Socket:使用的是 UDP(User Datagram Protocol) 協議,這是一種無連…