知識點:
1.快速入門?
知識點 | 核心內容 | 重點 |
IOC容器創建 | 通過ClassPathXmlApplicationContext加載XML配置文件創建容器,關聯beans.xml | 容器與配置文件的綁定關系(多配置文件支持) |
Bean獲取方式 | 1. getBean(String id)返回Object需強轉; 2. getBean(String id, Class<T> type)直接返回目標類型 | 方法重載區別(編譯類型與運行類型驗證) |
運行類型驗證 | 通過getClass()輸出對象實際類型,確認Spring容器管理的Bean實例 | 強轉前提是配置的全路徑類名正確 |
屬性訪問 | 強轉后直接調用Bean的getter方法(如getName())獲取配置屬性 | XML配置屬性與類字段的映射關系 |
容器結構 | ApplicationContext接口的多種實現類(如FileSystemXmlApplicationContext) | 不同實現類的適用場景(未展開) |
測試框架集成 | 使用JUnit測試Spring Bean,演示@Test注解和斷言邏輯 | 版本兼容性問題(提及JUnit 5.4) |
2.類加載路徑
知識點 | 核心內容 | 重點 |
Spring類加載路徑機制 | 程序運行時默認從out/production/[項目名]目錄讀取資源文件(如beans.xml),而非直接讀取src下的源文件 | 類路徑與實際文件路徑的差異(src vs out/production) |
ClassPathXmlApplicationContext工作原理 | 通過new ClassPathXmlApplicationContext("beans.xml")加載配置文件時,自動基于類加載路徑定位文件 | 需明確beans.xml必須存在于編譯后的資源目錄(如resources文件夾或src編譯產物) |
類路徑驗證方法 | 使用this.getClass().getResource("/").getPath()輸出實際類加載路徑 | 動態驗證路徑與預期是否一致(如IDE構建工具差異) |
資源文件部署邏輯 | src下的配置文件在編譯后會自動復制到out/production對應目錄 | 子目錄結構需保持一致性(如src/com/config → out/production/com/config) |
3.Debug配置
知識點 | 核心內容 | 重點 |
Spring容器結構分析 | 通過debug方式觀察Spring容器內部結構,理解其機制 | 容器數據視圖差異(配置導致顯示不同) |
OOP編程思想 | 強調通過debug輸出對象結構是高效學習方式 | 對象結構可視化的重要性 |
IDEA調試配置 | Settings > Debugger > Data Views控制debug數據展示邏輯 | 空元素顯示開關(Hide null elements)和視圖簡化開關(Enable alternative view) |
Step Into源碼調試 | 需取消勾選Do not step into the classes以進入指定類源碼 | 默認配置可能阻止進入JDK/庫類源碼 |
Debug視圖差異根源 | 數據展示差異由Data Views配置項決定,非版本問題 | 配置一致性對協作調試的影響 |
ConcurrentHashMap結構 | 通過beanDefinitionMap的table數組觀察實際存儲結構 | 空元素隱藏可能導致誤解底層結構 |
4.Spring容器結構剖析
知識點 | 核心內容 | 重點 |
Spring IOC容器結構 | IOC容器是重量級對象,通常單例存在,內部通過ConcurrentHashMap存儲Bean定義信息 | BeanDefinitionMap與SingletonObjects的區別(定義信息 vs 實例化對象) |
BeanDefinition存儲機制 | 配置的Bean信息(如monster類路徑、屬性值)存儲在BeanDefinitionMap的ConcurrentHashMap中(初始大小512) | 懶加載(lazy-init)與立即加載的觸發時機 |
Bean實例化過程 | 單例對象實際存儲在SingletonObjects的ConcurrentHashMap中,Key為Bean ID,Value為實例化對象 | 反射創建對象依賴BeanDefinition中的類路徑和屬性值 |
ConcurrentHashMap底層結構 | 使用Node內部類(哈希值+Key+Value+鏈表結構)存儲數據,支持高并發 | 哈希算法定位與泛型設計(適應不同Bean類型) |
屬性值注入邏輯 | propertyValues字段記錄XML配置的屬性(如monsterId=100),通過反射注入到實例化對象 | 動態創建非單例Bean時如何復用屬性配置 |
5.Spring容器結構剖析
知識點 | 核心內容 | 重點 |
IOC容器結構 | 容器類型為ClassPathXmlApplicationContext,包含BeanFactory等屬性 | BeanFactory與ApplicationContext的區別 |
BeanDefinitionMap | 使用ConcurrentHashMap存儲XML配置的Bean節點信息 | 并發容器選擇原因(線程安全 vs 性能) |
Bean存儲機制 | 通過哈希算法將Bean信息存入數組(初始容量512),動態擴容 | 哈希沖突處理與擴容觸發條件 |
Bean節點解析 | 保存Bean的ID、類信息、屬性值、懶加載配置等 | 懶加載與立即加載的底層實現差異 |
屬性映射 | PropertyValues數組存儲XML中配置的屬性名和值 | 反射注入屬性時的類型轉換問題 |
底層模擬實現 | 手寫Spring需模擬BeanDefinitionMap和ConcurrentHashMap結構 | Node節點中KV的設計(Key=Bean ID, Value=元數據) |
6.Spring容器結構剖析
知識點 | 核心內容 | 重點 |
Spring容器結構 | bin factory中的single objects屬性存儲單例對象 | 區分bind ebinishm AP(定義map)和single objects(實例對象) |
單例模式實現 | 通過concurrent hash map實現線程安全的單例存儲 | 單例對象直接初始化放入table,非單例則動態創建 |
對象獲取流程 | get bin時先查bin definition,再根據單例標識決定從緩存獲取或反射創建 | 理解ID->定義->實例的三層跳轉邏輯 |
輔助設計機制 | bin definition names用array list存儲所有配置的ID名稱 | 快速定位功能與容器性能的平衡設計 |
IOC容器本質 | beans點插門文件配置信息與運行時容器對象的映射關系 | 配置元數據(bin definition)與實際實例(single objects)的分離 |
7.Spring容器結構練習
知識點 | 核心內容 | 重點 |
IOC容器結構 | 講解IOC容器的核心結構及其重要性,理解結構后能更清晰掌握Spring相關方法 | 容器結構的邏輯關系、bin definition names屬性的作用 |
獲取容器中的Bean信息 | 通過getBinDefinitionNames()方法獲取所有Bean的ID,并遍歷輸出 | getBinDefinitionNames()返回的是數組結構,需注意遍歷方式 |
Bean的配置與ID唯一性 | 配置多個Bean時,ID必須唯一,否則會導致沖突;類型可以相同,但值不同 | ID沖突問題、Bean的作用域(單例/原型) |
Debug視圖優化 | 調整Debug視圖過濾空元素,簡化數據結構展示,便于觀察Bean的存儲位置 | 視圖配置方法、singleObjects和binDefinitionMap的實際存儲結構 |
Spring容器啟動時的默認Bean | 容器啟動時會預先加載系統默認的單例Bean(如applicationStartup、lifecycleProcessor等) | 系統Bean的作用、自定義Bean與系統Bean的區分 |
8.實現簡單基于XML配置程序 需求說明
知識點 | 核心內容 | 重點 |
Spring容器基礎實現 | 手動開發基于XML配置的簡易Spring容器,讀取beans.xml文件并實例化首個JavaBean(如master對象) | 屬性注入與容器存儲邏輯(需區分原生框架與模擬實現的差異) |
XML配置解析 | 通過property標簽獲取Bean屬性值(如name="牛魔王"、id=100),完成對象賦值 | 文件解析順序(僅處理首個Bean,非全量遍歷) |
容器機制模擬 | 實現getBean()方法輸出對象信息,簡化版IoC流程(創建→賦值→存儲→輸出) | 與Spring原生容器的核心差異(如生命周期管理、依賴注入等) |
實踐目標 | 理解Spring底層機制(強調流程梳理,非完整功能復現) | 需明確"超級簡單"實現與工業級容器的邊界 |
9.實現簡單基于XML配置程序 思路分析
知識點 | 核心內容 | 重點 |
Spring容器實現機制 | 通過XML解析、反射和ConcurrentHashMap實現簡易IoC容器 | 單例對象存儲方式 vs 原型模式 |
DOM4J技術應用 | 解析beans.xml配置文件獲取bean定義信息 | class路徑解析與異常處理 |
反射機制 | 通過無參構造器創建對象并動態設置屬性值 | 屬性注入與類型轉換問題 |
容器設計模式 | 使用ConcurrentHashMap存儲單例bean對象 | 并發控制與線程安全問題 |
簡易IoC流程 | 1. XML解析 → 2. 反射實例化 → 3. 屬性注入 → 4. 容器注冊 → 5. getBean方法 | 流程順序與各環節異常處理 |
工程簡化原則 | 聚焦核心機制(單例處理)而非完整功能 | 遍歷邏輯與擴展性設計取舍 |