SpringBoot -- 自動配置原理

SpringBoot 自動配置原理

基礎知識

Bean掃描

我們在學習 Spring 的時候,如果要把標注一下注解的類掃描進 IOC 容器 @Controller,@Service,@Mapper,是需要通過一下兩種方式實現的,但是我們在 SpringBoot 工程中并沒有編寫有關這個的代碼啊?

在這里插入圖片描述

  • 其實這部分代碼是存在的,只是 SpringBoot 已經幫我們寫好了,只要遵循相關約定就能實現 Bean 掃描功能,我們可以點開主啟動類上面的注解 @SpringBootApplication

Bean注冊

我們之前 Spring 學過使用一下注解可以將自己寫的 Bean (Controller) 注冊道 IOC 容器內。但是對于第三方Jar 包上(只讀文件,不能在他上面添加注解)的 Bean 我們如何注冊呢 ? 一共有兩種方式:通過@Bean 注解,@Import 注解

在這里插入圖片描述

  • 通過 @Bean 注解

該注解可以把方法的返回值,作為 Bean 對象注冊進 IOC 容器中,我下面用 SpringBoot 這個 Swagger 的配置類注入并來演示(不懂 Swagger3 沒關系)

在這里插入圖片描述

  • @Import 注解

我們上面演示的是 @configuration 注解在啟動類所在的包下,如果不在呢?這是我們可以使用 @Import 注解,直接將它導入進來。我們一般將他用來導入 配置類,ImportSelector 接口的實現類
在這里插入圖片描述

我們觀察上面的導入,有沒有發現一個問題。就是假如我需要導入的配置類有很多,那么全寫在這里面后,代碼是不是會顯得很臃腫,測試就要用到 ImportSelector 了。

編寫 ImportSelector 接口實現類

在這里插入圖片描述
在這里插入圖片描述

修改啟動類的導入代碼

在這里插入圖片描述

進一步優化

上面配置類存放數組內容是寫死的,提高了代碼的耦合性,我們可以把這些內容單獨放進配置文件類,然后利用輸入流逐條獲取出來放進數組

在這里插入圖片描述

注冊條件

當我們注入 Bean 的時候,如果滿足某種條件時我們才注入不然就不注入,這些內容會在自定義 Starter 時和查看 SpringBoot 源碼時會看到關于這個一共有三個注解可以實現如下

在這里插入圖片描述

@ConditionalOnProperty 注解介紹

在這里插入圖片描述

在這里插入圖片描述

@ConditionalOnMissingBean 注解介紹

在這里插入圖片描述

@ConditionOnClass 注解介紹

在這里插入圖片描述

自動配置原理

源碼解析

在這里插入圖片描述

面試該如何回答
  • 在主啟動類上添加了 @SpringBootApplication 注解,該注解組合 @EnableAutoConfiguration 注解,而這個注解又組合了 @Import 注解,導入了 AutoConfigurationImportSelector.class 類,
  • 該類實現了 selectImports 方法,這個方法經過層層調用,最終會讀取 META-INF 目錄下的后綴名為 imports 的文件(配置文件,里面存放很多配置類的全類名)
  • 讀取到該文件下的全類名后,會先解析注冊條件(@Conditional 及其衍生注解),把滿足條件的 Bean 對象注冊到 IOC 容器中
    在這里插入圖片描述

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

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

相關文章

Kubernetes從入門到精通-服務發現Service

一、為什么需要 Service? Pod 的動態性: Pod 是 Kubernetes 調度的基本單位。它們可能因為故障、滾動更新、擴縮容等原因隨時被創建或銷毀。 Pod IP 的不穩定性: 每個 Pod 都有自己的 IP 地址,但當 Pod 重建時,IP 地址…

Milvus 資源調度系統的核心部分:「查詢節點」「資源組」「數據庫」

Milvus 的資源管理分為三層:查詢節點、資源組和 數據庫。 查詢節點:處理查詢任務的組件。它在物理機或容器(如 Kubernetes 中的 pod)上運行。 資源組:查詢節點的集合,充當邏輯組件(數據庫和 C…

我的第一個開源項目:用Python搭建輕量級靜態網頁服務器—— 零基礎也能實現的Web開發初體驗

一、為什么選擇靜態服務器? 極簡高效:無需數據庫或復雜后端邏輯,適合展示簡歷、作品集等靜態內容 學習曲線平緩:是理解HTTP協議和Web服務原理的最佳入門方式 資源消耗低:單文件Python腳本即可運行,內存占…

github 圖床使用免費CDN加速(jsdelivr)

github做圖床大部分人都知道,但是國內訪問速度不穩定,所以使用jsdelivr加速。 jsdelivr是什么呢?它是一個免費、快速和可信賴的CDN加速服務,直接集成在github中的,無需額外操作即可使用。 本文分兩部份,最…

lte高階調制和AMC

文章目錄 LTE高階調制AMC LTE高階調制 首先什么是調制?調制是把通信系統中的基帶信號(低頻)轉化成適合信道傳輸的高頻信號的過程。 波長(λ)與頻率(f) 基本關系: λc/f,λc/f&…

shardingsphere5.2.1與SpringBoot3.X的版本沖突問題

1.先說一下我的版本配置與遇到的問題 問題產生的依賴和版本: 主要依賴依賴版本jdk17SpringBoot 3.3.13shardingsphere-jdbc 5.2.1 問題產生的原因: 主要就是shardingsphere-jdbc 與SpringBoot版本沖突,因為Spring Boot 需要 SnakeYAML 庫來解…

FPGA控制88E1512 PHY芯片完成網絡通信

一、88E1512分析 本文不對88E1512進行詳細解析,僅對調試過程中重點使用的幾個寄存器進行說明。 1.1 MDIO時序分析 根據手冊,MDIO時序中,mdc時鐘最高為12Mhz。占空比和建立保持時間要求可以觀察上述表格。 MDIO的讀數據時序圖如下&#xff1a…

Ai大模型 - ocr圖像識別形成結構化數據(pp-ocr+nlp結合) 以及訓練微調實現方案(初稿)

全局目錄,一步到位 功能流程第一階段 基于現有條件進行 調研,測試與評估1.1 ocr深度學習模型 pp-ocr1.2 nlp結構化模型1.3 硬件要求: 第二階段 模型訓練微調2.1 更換ocr-GPU模型, 下載相關環境2.2 nlp模型 語義訓練2.3 最低硬件要求:2.4 樣本數據: (重點)2.5 進一步增強模型能力…

【Linux】軟硬鏈接,動靜態庫

目錄 一、認識一下常用指令 1、建立一個軟鏈接 2、建立一個硬鏈接 3、刪除文件的第二種方式:刪除鏈接unlink指令 二、什么是硬鏈接? 三、軟硬鏈接的原理: 四、應用場景 1、建立一個軟鏈接可以快速在一個比較深的路徑中找到目標文件進行…

VRR(可變刷新率)和QMS(快速媒體切換)

🔧 一、技術原理的本質區別 技術VRR (可變刷新率)QMS (快速媒體切換)核心目標消除動態幀率波動導致的畫面撕裂/卡頓消除靜態幀率切換時的黑屏中斷工作機制實時調整顯示器刷新率(Hz)匹配GPU輸出幀率(FPS)→ 動態延長/縮…

GO 語言學習 之 Map

map 是 Go 語言中非常重要的數據結構,常用于需要快速查找、統計或分組數據的場景。 map定義: package mainimport "fmt"func main() {var m1 map[int]string // 創建一個 mapm2 : make(map[int]string) // 創建一個 map m3…

什么是可觀測性?監控、日志、追蹤三者之間有什么區別?

一、引言:為什么現代系統需要“看得見”? 你是否遇到過這樣的情況:系統運行突然變慢,但沒人知道問題出在哪?隨著微服務、云原生架構的普及,系統的復雜度越來越高,傳統的“靠經驗判斷”已經無法…

扣子(coze)實戰|自動搬運+改寫+歸檔!自媒體矩陣終極方案

今天給大家分享的是用coze做一個工作流來自動提取抖音/小紅書視頻文案及改寫并傳入到飛書多維表格,我們先來看案例 上傳視頻鏈接即可一鍵生成,廢話不多說,上教程~ 一、整體工作流如下: 二、開發思路: 三、詳細工作流分…

K8s環境下基于Nginx WebDAV與TLS/SSL的文件上傳下載部署指南

#作者:閆乾苓 文章目錄 1.問題及背景2.方案說明3.部署步驟3.1 制作TLS/SSL私有證書3.2 創建訪問nginx賬戶密碼文件并創建secret3.3 為TLS/SSL私有證書創建secret3.4 為Nginx 配置文件創建confimap3.5 使用deployment,svc部署nginx3.6 客戶端curl上傳下載…

【Day 7-N17】Python函數(1)——函數定義、位置參數調用函數、關鍵字參數調用函數、函數的默認值

挑戰14天學會Python,第7天學習筆記!加油! 一、概述 函數(Function)是 Python 中用于封裝可重用代碼塊的基本結構。通過定義函數,我們可以將復雜邏輯拆分為更小、更易管理的單元,并通過參數傳遞…

STM32 驅動 ADS1015 單端 差分 多通道模式 ADC 轉換

文章目錄 一、ADS1015簡介二、引腳功能三、寄存器介紹1.Conversion Register 轉化數據存放寄存器2.Config Register 配置寄存器 四、IIC時序1.寫寄存器2.讀寄存器 五、程序六、實驗現象1.單端模式2.差分模式3.偽多通道模式 一、ADS1015簡介 ADS1015 是一款由德州儀器&#xff…

RabbitMQ 消費冪等性與消息重放實現

一、冪等性實現 1.1 什么是冪等性? 冪等性是指同一條消息無論被消費多少次,業務結果都只生效一次,防止重復扣款、重復發貨等問題。 RabbitMQ 的投遞模式是“至少一次交付”(at-least-once delivery),如果消費者處理失敗或者沒有及…

【HarmonyOS 5】鴻蒙TEE(可信執行環境)詳解

【HarmonyOS 5】鴻蒙TEE(可信執行環境)詳解 一、TEE是什么? 1、TEE的定義: 可信執行環境(Trusted Execution Environment),簡稱TEE,是存在于智能手機、平板或任意移動設備主處理器…

算法: 冒泡排序

冒泡排序是一種簡單的排序算法,通過相鄰元素的比較和交換,使較大的元素逐漸"浮"到數組末尾。 時間復雜度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空間復雜度:O(1) 穩定性:穩定 應用場景/前提條件 適用于小規模數據對幾乎已排序的數據效率較高…

基于SpringBoot的家電銷售展示平臺

源碼編號:S567 源碼名稱:基于SpringBoot的家電銷售展示平臺 用戶類型:雙角色,用戶、管理員 數據庫表數量:14 張表 主要技術:Java、Vue、ElementUl 、SpringBoot、Maven 運行環境:Windows/M…