反射在spring boot自動配置的應用

目錄

一,背景

二,知識回顧

2.1 理解使用反射技術,讀取配置文件創建目標對象(成員變量,方法,構造方法等)

三,springboot自動配置

3.1 反射在自動配置中的工作流程

3.2 瀏覽源碼,逐步瀏覽spring boot自動配置

?四,?理解 starter?

4.1 自定義starter?


一,背景


一直以來,我們在完成spring boot項目中,一直遵循 固定的模式:

1,向pom文件引入依賴(starter)

2 ,使用依賴 的注解

3 ,觀察引入的注解,是否報錯,如果沒有報錯,編譯運行觀察結果

4 如果報錯結合 自己所學知識+Ai輔助

至于這個注解,是怎么生效的,何時起作用,我們并沒有關注,但實際上spring boot已經幫我們做好了。


今天,我就要和大家一起,深挖在spring boot 中,我們使用的注解 是怎么起作用的?----------------spring boot自動配置


二,知識回顧

在學習spring boot自動配置 之前,我們先要復習以下:通過配置文件動態創建對象

2.1 理解使用反射技術,讀取配置文件創建目標對象(成員變量,方法,構造方法等)

配置文件+反射技術 應用場景:

實際開發中,當我們項目部署到服務器,一般情況下,不允許重新部署,但我們想要開發新的功能,可以使用配置文件+反射相結合完成新功能的添加與修改。


案例

背景:原本創建 🐺,🐏 對象實現動物接口,并在測試類中運行方法。但在運行后,才發現:還沒有創建 狼對象,于是使用反射+配置文件讀取的方式,實現對狼的創建

util工具類 :讀取 配置文件內容

package com.it.heima;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class util {public static String readProperties() {Properties properties = new Properties();String path = null;try(// 獲取配置文件流InputStream resourceAsStream = test.class.getClassLoader().getResourceAsStream("data.properties")){properties.load(resourceAsStream);path = properties.getProperty("wolf");
//            System.out.println(path);} catch (IOException e) {e.printStackTrace();}return path;}
}

data.properties配置文件

test測試類

package com.it.heima;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class test {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {Sheep sheep = new Sheep();sheep.run();sheep.eat();sheep.sleep();System.out.println("--------------------------");String path = util.readProperties();Wolf wolf = (Wolf)Class.forName(path).newInstance();wolf.run();wolf.eat();}
}
測試結果:
綿羊跑跑~~~~~~~~
綿羊吃吃~~~~~~~~
綿羊睡覺~~~~~~~~
--------------------------
com.it.heima.Wolf
狼跑~~~~~~~~~~~
狼吃羊~~~~~~~

"上面這個案例展示了反射的基本用法 —— 通過配置文件動態創建對象。而 Spring Boot 的自動配置,本質上就是把這個過程標準化、規模化:框架通過反射讀取類路徑、注解和配置文件,自動為我們創建和配置各種 Bean,這就是我們接下來要深入探討的內容。"


三,springboot自動配置

3.1 反射在自動配置中的工作流程

1,類路徑掃描:Spring Boot 會掃描類路徑下的所有類,找出帶有特定注解的類。@compoentscan注解
2,條件評估:通過反射檢查類、方法或者字段的存在情況,以此確定是否應用某項配置。@Condition衍生注解+@Bean
3,實例化 Bean:利用反射調用構造函數或者工廠方法來創建 Bean 實例。
4,依賴注入:借助反射設置 Bean 的字段值或者調用 setter 方法。


案例

@Configuration
@ConditionalOnClass(RestTemplate.class) // 反射檢查類是否存在
@EnableConfigurationProperties(MyAutoConfigProperties.class)
public class MyAutoConfiguration {
private final MyAutoConfigProperties properties;public MyAutoConfiguration(MyAutoConfigProperties properties) {this.properties = properties;
}@Bean
@ConditionalOnMissingBean // 反射檢查Bean是否已存在
public RestTemplate restTemplate() {RestTemplate template = new RestTemplate();// 基于配置屬性進行定制if (properties.isLoggingEnabled()) {template.getInterceptors().add(new LoggingInterceptor());}return template;
}

3.2 瀏覽源碼,逐步瀏覽spring boot自動配置

這里,我將拿web起步依賴舉例:

以下圖片是我截取 來自博客鏈接 :學習springboot 的自動配置原理_spring-boot-autoconfigure-CSDN博客

核心看到 selectImport方法

11進入DispatcherServletAutoConfiguration 自動配置類

關于條件注解的詳情可以瀏覽 :學習springboot-條件化配置@Conditional(條件注解)_springboot條件化配置-CSDN博客


?四,?理解 starter?

starter:一組功能模塊的坐標,當我們引用坐標時,可以使用它提供的功能

starter本質:接口+接口實現類/接口實現類?


4.1 自定義starter?

可以結合:springboot學習(自定義starter)_springboot3.4.3 引入 定義 springboot starter-CSDN博客

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

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

相關文章

機器學習 Day1

機器學習概述 機器學習與人工智能、深度學習關系什么是機器學習數據集算法 機器學習與人工智能、深度學習關系 什么是機器學習 機器學習是從數據中自動分析獲取模型,并利用模型對未知數據進行預測。 直觀理解: 所以是從歷史數據中獲取規律,那么這些歷…

Disruptor—2.并發編程相關簡介

大綱 1.并發類容器 2.volatile關鍵字與內存分析 3.Atomic系列類與UnSafe類 4.JUC常用工具類 5.AQS各種鎖與架構核心 6.線程池的最佳使用指南 1.并發類容器 (1)ConcurrentMap (2)CopyOnWrite容器 (3)ArrayBlockingQueue (4)LinkedBlockingQueue (5)SynchronousQueue …

開盤啦 APP 抓包 逆向分析

聲明: 本文章中所有內容僅供學習交流使用,不用于其他任何目的,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關! 抓包 這是一個記錄貼。 這個APP是數…

YOLOv8損失函數代碼詳解(示例展示數據變換過程)

本文將展示YOLOv8中損失函數計算的完整代碼解析,注釋中提供了詳盡的解釋,并結合示例演示了數據維度的轉換,以幫助更好地理解。 YOLOv8的損失函數計算代碼位于ultralytics/utils/loss.py文件中(如下所示),我…

微信小程序調用藍牙API “wx.writeBLECharacteristicValue()“ 報 errCode: 10008 的解決方案

1、問題現象 問題:在開發微信小程序藍牙通信功能時,常常會遇到莫名其妙的錯誤,查閱官方文檔可能也無法找到答案。如在寫入藍牙數據時,報了這樣的錯誤: {errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOW…

軟考 UML中的 用例圖 的泛化 包含 擴展 關系

用例圖的泛化、擴展和包含 - ^_^肥仔John - 博客園

MyBatis-Plus的自帶分頁方法生成的SQL失敗:The error occurred while setting parameters

1、error描述 數據庫是postgres,Java使用mybatis-plus的分頁功能,生成的分頁SQL不能正常運行。 "msg": "nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: com.baomidou.my…

Redis從入門到實戰 - 原理篇

一、數據結構 1. 動態字符串SDS 我們都知道Redis中保存的key是字符串,value往往是字符串或者字符串的集合。可見字符串是Redis中最常用的一種數據結構。 不過Redis沒有直接使用C語言中的字符串,因為C語言字符串存在很多問題: 獲取字符串長…

人形機器人通過觀看視頻學習人類動作的技術可行性與前景展望

摘要 本文深入探討人形機器人通過觀看視頻學習人類動作這一技術路線的正確性與深遠潛力。首先闡述該技術路線在模仿人類學習過程方面的優勢,包括對人類動作、表情、發音及情感模仿的可行性與實現路徑。接著從技術原理、大數據訓練基礎、與人類學習速度對比等角度論證…

高分辨率北半球多年凍土數據集(2000-2016)

關鍵數據集分類&#xff1a;冰凍圈數據集時間分辨率&#xff1a;10 year < x < 100 year空間分辨率&#xff1a;1km - 10km共享方式&#xff1a;開放獲取數據大小&#xff1a;339.79 MB數據時間范圍&#xff1a;2000-01-01 — 2016-12-31元數據更新時間&#xff1a;2022-…

零售智能執行大模型架構設計:從空間建模到上下文推理,再到智能Agent

零售智能執行大模型架構設計&#xff1a;從空間建模到上下文推理&#xff0c;再到智能Agent &#x1f9e0; 引言&#xff1a;零售智能執行的再定義 在傳統零售執行中&#xff0c;面對SKU數量龐雜、貨架布置多變、陳列標準難以落地等問題&#xff0c;靠人力巡檢或輕量識別模型已…

RIP 協議實驗全記錄:從配置到問題解決

在網絡世界中&#xff0c;路由協議就像是交通指揮員&#xff0c;引導數據在不同網絡之間順暢傳輸。今天&#xff0c;我們就來深入探索 RIP&#xff08;Routing Information Protocol&#xff09;協議&#xff0c;通過一系列實驗&#xff0c;揭開它的神秘面紗&#xff01; 一、搭…

基于SpringBoot的網上租賃系統設計與實現

項目簡介 本項目是基于 Spring Boot Vue 技術棧開發的 網上租賃系統。該系統通過前后端分離的架構&#xff0c;提供用戶和管理員兩種角色的操作權限&#xff0c;方便用戶進行商品租賃、訂單管理、信息查詢等操作&#xff0c;同時也為管理員提供了商品管理、用戶管理、訂單管理…

uni-app學習筆記六-vue3響應式基礎

一.使用ref定義響應式變量 在組合式 API 中&#xff0c;推薦使用 ref() 函數來聲明響應式狀態&#xff0c;ref() 接收參數&#xff0c;并將其包裹在一個帶有 .value 屬性的 ref 對象中返回 示例代碼&#xff1a; <template> <view>{{ num1 }}</view><vi…

CUDA 性能優化 | 共享內存機制 / 向量化訪存策略

注&#xff1a;本文為“CUDA 性能優化”相關文章合輯。 圖片清晰度受引文原圖所限。 重傳部分 CSDN 轉儲失敗圖片。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 Shared Memory 上的廣播機制和 Bank Conflict 到底是怎么回事&#xff1f; 發表于 2…

NVMe高速傳輸之擺脫XDMA設計1

NVMe IP放棄XDMA原因 選用XDMA做NVMe IP的關鍵傳輸模塊&#xff0c;可以加速IP的設計&#xff0c;但是XDMA對于開發者來說&#xff0c;還是不方便&#xff0c;原因是它就象一個黑匣子&#xff0c;調試也非一番周折&#xff0c;尤其是后面PCIe4.0升級。 因此決定直接采用PCIe設…

企業級單元測試流程

企業級的單元測試流程不僅是簡單編寫測試用例&#xff0c;而是一整套系統化、自動化、可維護、可度量的工程實踐&#xff0c;貫穿從代碼編寫到上線部署的全生命周期。下面是一個盡可能完善的 企業級單元測試流程設計方案&#xff0c;適用于 Java 生態&#xff08;JUnit Mockit…

關于vector、queue、list哪邊是front、哪邊是back,增加、刪除元素操作

容器的 front、back 及操作方向 1.1vector&#xff08;動態數組&#xff09; 結構&#xff1a;連續內存塊&#xff0c;支持快速隨機訪問。 操作方向&#xff1a; front&#xff1a;第一個元素&#xff08;索引 0&#xff09;。 back&#xff1a;最后一個元素&#xff08;索引…

嵌入式之匯編程序示例

目錄 經典例子:求階乘 一:數組求和 二:數據壓棧退棧 三:函數嵌套調用 經典例子:求階乘 知識點: BGT 用于判斷 r2 > r0&#xff0c;確保循環執行 恰好 r0 次。BNE 用于判斷 r2 ≠ r0&#xff0c;會導致循環多執行一次&#xff0c;得到錯誤結果。 這就是階乘代碼中必須…

【MySQL】第九彈——索引(下)

文章目錄 &#x1f30f;索引(上)回顧&#x1f30f;使用索引&#x1fa90;自動創建索引&#x1fa90;手動創建索引&#x1f680;主鍵索引&#x1f680;普通索引&#x1f680;唯一索引&#x1f680;復合索引 &#x1fa90;查看索引&#x1fa90;刪除索引&#x1f680;刪除主鍵索引…