學習記錄:DAY20

技術探索之旅:YAML配置,依賴注入、控制反轉與Java注解

前言

最近有點懶了,太松懈可不行。為了讓自己保持學習的動力,我決定將最近的學習內容整理成博客,目標是讓未來的自己也能輕松理解。我會盡量以整體記錄的方式呈現,所以一篇博客可能會分幾天完成。今天,我們先來研究一下依賴注入和控制反轉,順便把昨天的 YAML 配置映射的博客補充一下。

日程

  • 8點:中午稍微看了一點內容,先來寫博客,再看看今天晚上能學到多少東西。
  • 11點:下班吧,復習一會兒。

學習記錄

操作系統

  1. 分段存儲管理
  2. 段頁式管理

學習內容

省流

  1. YAML 配置文件
  2. 依賴注入與控制反轉
  3. Java 注解

1. YAML 配置文件

問題背景

在一輪項目中,我將一些配置相關的常量寫到了單例里面。這種方法的優點是實現簡單,但不利于更改,尤其是在將項目作為 JAR 包部署到服務器時。將配置信息寫入 YAML 文件,主要就是為了解決這個問題。

實現方式

主要調用了 Jackson 的 YAML 解析依賴:

<!-- YAML 格式解析器 -->
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId><version>2.17.1</version>
</dependency>

以我現在的 YAML 配置文件為例:

# Tomcat 相關配置
tomcat:# 端口port: 8080# webapp 目錄webappDir: "Anykat-application/src/webapp"# 掃描的目錄classesDir: "Anykat-application/target/classes"# Jwt 相關配置
jwt:# Jwt 密鑰secretKey:  "ProjectAnykatKaCatIsMyLongLongSecretKeyTo256Bits"# 管理員 Jwt 密鑰adminSecretKey: "ProjectAnykatKaCatIsMyLongLongSecretKeyTo256BitsUsingByAdmin"# 有效時間expireTime: 21600000 # 6h

通過一個單例來管理:

public class AppConfig {private TomcatConfig tomcat;private JwtConfig jwt;// 私有靜態實例變量private static volatile AppConfig instance;// 私有構造函數防止外部實例化private AppConfig() throws FileNotFoundException {}// 獲取單例的靜態方法public static AppConfig getInstance() throws FileNotFoundException {if (instance == null) {...}return instance;}
}

在單例實例化時進行加載:

// 加載配置文件
Yaml yaml = new Yaml();
instance = yaml.loadAs(new FileInputStream("config.yml"),AppConfig.class
);
缺點

這種方法的實現比較粗糙簡單,它對 YAML 字段的對應有嚴格要求,且必須有相應的實體類來接收 YAML 映射。因為通過單例進行加載,所以不支持熱更新。

改進建議
  • 通過反射和動態代理來生成對應字段的實體類,不依賴硬編碼的實體類。
  • 把單例模式換成其他模式,來支持配置的熱更新。

2. 依賴注入與控制反轉

作用分析

首先,我們來了解一下這是一種什么工作模式:

  • 不直接創建實體類的對象,而是先把實體類交給 IoC 容器管理(控制反轉),在需要使用時,再從容器中取出對應的對象(依賴注入)。
  • 對比直接通過 new 創建對象,這樣做的好處包括:
    • 生命周期管理:自動處理對象銷毀,避免內存泄漏;處理復雜的生命周期(單獨實例/共享單例實例)。
    • 依賴關系管理:裝配時自動處理依賴的裝配;解決循環依賴、嵌套依賴(三層緩沖)。
    • 低耦合度:實例替換;單元測試(mockBean 替換)。
    • 可配置性和靈活性:可以在不修改代碼的情況下通過配置改變應用程序行為;支持運行時決定具體實現(如根據環境選擇不同實現)。
    • 集中管理:所有對象的創建和依賴關系在一個地方管理;便于維護和了解系統整體結構。
原理分析

Spring Boot 中的依賴注入主要有以下核心功能:

  • 注冊組件(類)
  • 管理組件實例
  • 自動解析依賴關系
  • 提供獲取 Bean 的接口

工作流程如下:

  1. 組件注冊階段

    • 啟動時掃描配置的包路徑。
    • 將被注解的類轉換為 BeanDefinition 對象。
    • 注冊到 BeanDefinitionRegistry(由 DefaultListableBeanFactory 實現):
      • 使用 beanDefinitionMapConcurrentHashMap)存儲 Bean 的定義。
      • 維護 beanDefinitionNames 列表保持順序。
  2. 預處理階段

    • 執行 BeanFactoryPostProcessor(可修改 BeanDefinition)。
    • 處理一些元數據相關的注解。
    • 預解析依賴關系。
  3. 實例化管理階段DefaultListableBeanFactory):

    • 按依賴順序實例化:
      • 通過 createBean() 創建實例。
      • 使用三級緩存解決循環依賴。
      • 依賴注入(@AutowiredAutowiredAnnotationBeanPostProcessor 處理)。
      • 調用初始化方法(@PostConstruct)。
    • 存儲單例 Bean 到 singletonObjectsConcurrentHashMap)。
  4. 運行時階段

    • 處理 getBean() 請求。
    • 管理生命周期(包括銷毀過程)。
    • 處理作用域(單例/原型/請求/會話等)。

重要概念

  • BeanDefinition 不等同于 Bean 本身,它是 Bean 的解釋。
    • 比如:Bean 是一道要做的菜,BeanDefinition 是這道菜的菜譜。
    • Registry 是管理這些菜譜的管理員。
    • Factory 是負責做菜的那個廚神。

流程圖

不存在
單例
原型
請求級
啟動SpringBoot應用
組件注冊階段
掃描組件注解
生成BeanDefinition
注冊到Registry
存儲beanDefinitionMap
維護beanDefinitionNames
預處理階段
執行BeanFactoryPostProcessor
處理PrimaryDependsOn
構建依賴關系圖
實例化階段
是否單例
檢查singletonObjects
調用createBean
三級緩存處理
依賴注入
執行初始化
存入singletonObjects
直接創建實例
運行時階段
接收getBean請求
作用域類型
返回緩存實例
新建實例
作用域獲取
生命周期管理
銷毀清理
源碼分析

這是不得不品鑒的一環。先 clone 一下 Spring Framework 的源碼:Spring Framework 源碼。然后我自己慢慢看源碼(略過了哈)。

3. Java 注解

在正式編寫自己的 BeanFactory 方法之前,先來了解一下關于 Java 注解的基本知識。

Java 提供了一些內置注解:

  • @Override:表示方法覆蓋了父類中的方法。
  • @Deprecated:表示元素已過時,不推薦使用。
  • @SuppressWarnings:告訴編譯器忽略特定警告。
  • @SafeVarargs:斷言方法或構造器不會對其可變參數執行不安全的操作。
  • @FunctionalInterface:表示接口是函數式接口(Java 8)。

而實現自己的注解,則要用到 Java 的元注解:

  • @Target:指定注解可以應用的位置(如 TYPE(類、接口、注解、枚舉)、METHOD(方法)、FIELD(字段、常量)等)。
  • @Retention:指定注解的保留策略(SOURCE(源碼級,編譯時丟棄)、CLASS(類文件,運行時不加載)、RUNTIME(運行時))。
  • @Documented:表示注解應包含在 Javadoc 中。
  • @Inherited:表示子類可以繼承父類的注解。
  • @Repeatable:表示注解可以在同一位置重復使用(Java 8)。

示例:

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
}

重要說明
注解的本身沒有任何作用,它只是做了一個標記。例如,@Retention(RetentionPolicy.RUNTIME) 以屬性表的形式存儲在 .class 文件中,在運行時可以通過反射掃描到對應的字段。

結語

真的快把我看麻了,距離能夠自己實現一個依賴注入還有很長的路要走,加油吧!

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

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

相關文章

MCP:人工智能時代的HTTP?探索AI通信新標準

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

首版次誤區有哪些?與軟件測試報告又有什么聯系?

在軟件開發與測試領域&#xff0c;"首版次"這一概念關乎軟件的版本控制與管理&#xff0c;是確保產品質量和發布節奏的重要環節。首版次&#xff0c;通常是指軟件產品第一個對外發布或內部驗收的版本號&#xff0c;標志著一次完整開發周期的結束和下一階段工作的開始…

Laravel+API 接口

LaravelAPI 接口 網課連接&#xff1a;BIlibili. 中文文檔. 1.RestFul Api編碼風格 一、API設計 修改hosts&#xff0c;C:\Windows\System32\drivers\etc\hosts&#xff0c;增加127.0.0.1 api.lv8.com # Laravel 框架 用這個域名來測試&#xff08;推薦規范&#xff09; 在…

MIT6.S081-lab7前置

MIT6.S081-lab7前置 這部分包含了設備中斷和鎖的內容 設備中斷 之前系統調用的時候提過 usertrap &#xff0c;而我們的設備中斷&#xff0c;比如計時器中斷也會在這里執行&#xff0c;我們可以看看具體的邏輯&#xff1a; void usertrap(void) {int which_dev 0;if((r_sst…

Linux 下編譯BusyBox

一、linux下編譯 1.拉取busybox源碼 git clone https://github.com/mirror/busybox.git 內容如下 2.配置make&#xff0c;建議在linux下單獨開一個終端執行 進入busybox源碼目錄&#xff0c;使用如下命令 make menuconfig 3.報錯 解決辦法&#xff1a; 安裝ncurses sud…

Element:Cheack多選勾選效果邏輯判斷

效果展示 取消子級勾選&#xff0c;父級的勾選效果 代碼合集 &#xff08;1&#xff09;組件代碼 fromlist.cheackType 類型&#xff0c;permissio表示是權限. fromlist:[{id:1,children:[{...}]},...]傳遞的數據大致結構 <!-- 操作權限 --><template v-if"…

【3DMax腳本MaxScript開發:創建高效模型虛擬體綁定和材質管理系統,從3DMax到Unreal和Unity引擎_系列第一篇】

3ds Max 腳本開發 3ds Max 腳本開發&#xff1a;創建高效模型虛擬體綁定和材質管理系統3ds Max 插件制作背景&#xff1a;設計思路一、場景節點收集與過濾廢話不多說&#xff0c;直接上完整代碼&#xff1a;界面定義與基礎設置界面控件創建狀態變量核心邏輯函數過濾選項改變事件…

【Linux學習筆記】進程替換和自定義shell

【Linux學習筆記】進程替換和自定義shell &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Linux學習筆記 文章目錄 【Linux學習筆記】進程替換和自定義shell前言一.進程程序替換1.1 替換原理1.2 替換函數1.2.1函數解釋1.2.2命名理解 二.自主…

【辦公類-89-03】20250429AI寫的研討記錄,清除格式,統一格式,名字替換。部分加粗,添加頁眉

背景需求: 檢查自即,需要AI一下院內的五次科研培訓記錄。 本次用了豆包 豆包寫的不錯,也是“水字數”的高手 把每次培訓內容貼到WORD里 把AI資料貼到WORD里,發現問題: 1、字體、段落什么都是不統一的,需要統一改成宋體小四,1.5倍行距 2、十個研討人也要改成真人。就找…

unity Orbbec Femto Bolt接入unity流程記錄 AzureKinectExamples 插件 使用記錄

奧比中光的深度相機Orbbec Femto Bolt是Microsoft的Azure Kinect DK的升級版&#xff0c;根據官網的文檔配置環境遇到了一些問題&#xff0c;記錄一下。 注意&#xff1a; 官網文檔鏈接&#xff1a;Femto Bolt文檔 1、首先連接相機到電腦USB3.0&#xff0c;接通電源&#xf…

聊天室系統:多任務版TCP服務端程序開發詳細代碼解釋

1. 需求 目前我們開發的TCP服務端程序只能服務于一個客戶端&#xff0c;如何開發一個多任務版的TCP服務端程序能夠服務于多個客戶端呢? 完成多任務&#xff0c;可以使用線程&#xff0c;比進程更加節省內存資源。 2. 具體實現步驟 編寫一個TCP服務端程序&#xff0c;循環等…

Python3:裝飾器、生成器與迭代器

Python3&#xff1a;裝飾器、生成器與迭代器 一、&#x1f3ad; 裝飾器&#xff1a;給函數穿上"魔法外衣"裝飾器基本概念為裝飾器添加參數傳遞功能帶參數的裝飾器functools.wraps&#xff1a;保留原函數的元信息實用裝飾器示例1. 計時器裝飾器2. 緩存裝飾器(Memoizat…

SQL命令一:SQL 基礎操作與建表約束

目錄 引言 一、SQL 基礎命令 &#xff08;一&#xff09;數據庫相關操作 &#xff08;二&#xff09;表格相關操作 &#xff08;三&#xff09;MySQL 常用數據類型 二、增刪改查&#xff08;CRUD&#xff09;操作 &#xff08;一&#xff09;增加數據 &#xff08;二&a…

Windows 桌面個性高效組件工具

軟件介紹 Widgets 這款基于 Vue3 構建的開源 Windows 桌面小部件工具超實用。 其多樣化組件庫涵蓋超 20 種&#xff0c;從倒計時、打工進度等實用工具&#xff0c;到抖音熱榜等實時資訊組件應有盡有&#xff0c;各組件獨立運行&#xff0c;滿足多場景需求。 高度自定義布局支持…

PCB入門指南:從電阻到常見電路的全解析

知識點1【電阻】 常見的是 色環電阻和貼片電阻 1、色環電阻 色環電阻&#xff0c;早期是碳膜電阻&#xff0c;精度不是很高&#xff0c;一般是4個色環&#xff0c;紅 橙 黃 綠 藍 紫 灰 白 黑&#xff0c;每個顏色代表一個阻值 后期是金屬膜電阻&#xff0c;5個色環&#x…

論文閱讀的三個步驟

論文閱讀的三個步驟 方法說明鏈接&#xff1a;https://www.academia.edu/4907403/How_to_Read_a_Paper 方法框架如下

Centos 7 ssh連接速度慢(耗時20秒+)

作系統&#xff1a;centos7.9 現象突然間通過 ssh、xshell等客戶端工具連接時&#xff0c;連接速度緩慢&#xff0c;需要耗時20秒左右才能連接上 排查思路&#xff1a; 1. 查看操作系統日志 從系統日志里看到較多的錯誤&#xff0c;這個可能是一個bug &#xff08;現象類似&a…

通過腳本自動檢查項目中全局的中文

現在越來越多的公司在做出海項目&#xff0c;出海項目首先要解決的就是語言國際化的問題&#xff0c;有很多如l18n、l10n的工具可以用&#xff0c;這些工具可以提供解決方案&#xff0c;但是不能約束開發者的開發行為。開發者仍然可能在代碼中存留沒有做過國際化處理的部分&…

軟件分析師-第三遍-章節導圖-13/14

系統設計&#xff0c;按步驟分&#xff1a;概要設計、詳細設計。另一種分類方式&#xff1a;按設計內容和設計方法分。設計內容&#xff1a;處理流程、輸入/輸出原型、人機交互。設計方法&#xff1a;結構化、面向對象、設計模式。 軟件實現&測試&#xff0c;分為實現、測…

通過全局交叉注意力機制和距離感知訓練從多模態數據中識別橋本氏甲狀腺炎|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Hashimoto’s thyroiditis recognition from multi-modal data via globalcross-attention and distance-aware training 通過全局交叉注意力機制和距離感知訓練從多模態數據中識別橋本氏甲狀腺炎 01 文獻速遞介紹 橋本氏甲狀腺炎&#xff08;HT&#xff09;&a…