首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring 核心總結:IoC 容器與 Bean 生命周期全景圖

     編輯:Java 綜合教學

Spring 整體架構視角

Spring 官方模塊圖

個人理解架構圖

**核心三角**:**Core(工具箱)** + **Beans(原料)** + **Context(舞臺)** = 運行時 Spring 容器。

Bean 組件深度解析

包位置

`org.springframework.beans`

三大職責

  1. Bean 定義:`BeanDescription` 封裝 `` 節點所有信息(類名、屬性、構造參數、依賴、作用域、初始化/銷毀方法等)
  2. Bean 創建:工廠模式,頂級接口 `BeanFactory`,核心實現 `DefaultListableBeanFactory`
  3. Bean 解析:`BeanDefinitionReader` / `BeanDefinitionDocumentReader` 解析 XML/註解/掃描路徑

Context 組件:IoC 容器本體

包位置

`org.springframework.context`

核心接口體系

ApplicationContext 接口繼承圖

  • `ApplicationContext` 繼承 `BeanFactory` + 6 大擴展接口:
擴展接口能力
EnvironmentCapable環境變量/Profile 管理
ListableBeanFactory列表式 Bean 訪問
HierarchicalBeanFactory父子容器層級
MessageSource國際化訊息
ApplicationEventPublisher事件發布/觀察者模式
ResourcePatternResolver資源路徑模式解析

關鍵子接口

Context 子接口

  • `ConfigurableApplicationContext`:可刷新、可關閉、可註冊關閉鉤子
  • `WebApplicationContext`:Web 環境專用,持有 `ServletContext` 引用

Context 必做四件事

  1. 標識應用環境(ClassPath/FileSystem/AnnotationConfig/Web)
  2. 委託 BeanFactory 創建 Bean 實例
  3. 維護 Bean 依賴關系圖(IoC 容器本質)
  4. 發布/監聽容器事件(ContextRefreshedEvent 等)

Core 組件:資源抽象與工具箱

Resource 體系

Resource 類結構

  • 統一抽象:`ClassPathResource`、`FileSystemResource`、`ServletContextResource`、`UrlResource`、`InputStreamResource`、`ByteArrayResource`
  • 核心方法:`getInputStream()`、`exists()`、`getFile()`、`getURL()`、`getDescription()`
  • 屏蔽資源來源差異,Context 委託 `ResourcePatternResolver` 完成加載/解析/定義一體化

IoC 容器啟動流程精簡

  1. 創建 BeanFactory:`DefaultListableBeanFactory` 實例化
  2. 載入 Bean 定義:`XmlBeanDefinitionReader` / `ClassPathBeanDefinitionScanner` 解析配置 → `BeanDefinition` 註冊到 BeanFactory
  3. 實例化單例 Bean:`preInstantiateSingletons()` 遍歷 BeanDefinition → `getBean()` → 創建實例、屬性填充、初始化回調、註冊銷毀回調
  4. 發布容器就緒事件:`ContextRefreshedEvent` 通知監聽器

Bean 生命周期完整鏈路

實例化
  ↓
屬性填充 (依賴注入)
  ↓
Aware 接口回調 (BeanNameAware, BeanFactoryAware, ApplicationContextAware...)
  ↓
BeanPostProcessor.postProcessBeforeInitialization
  ↓
InitializingBean.afterPropertiesSet / @PostConstruct / init-method
  ↓
BeanPostProcessor.postProcessAfterInitialization  ← 代理對象在此生成(AOP)
  ↓
註冊銷毀回調 (DisposableBean / @PreDestroy / destroy-method)
  ↓
容器關閉時調用銷毀方法

類比總結

若 Bean 是**演員**,Context 是**舞臺**,Core 就是**道具組**。
舞臺負責發現演員、安排關系、提供燈光音效(事件/資源/國際化),道具組提供劇本解析、換裝道具(資源抽象/工具類)。
沒有舞臺,演員無處表演;沒有道具,舞臺無法運轉。

學習建議

  1. 先理解 **IoC 思想**(控制反轉/依賴注入),再看源碼實現
  2. 重點掌握 **BeanDefinition → BeanFactory → ApplicationContext** 三層遞進關系
  3. 動手調試 `BeanPostProcessor` 切點,體會 AOP 代理生成時機
  4. 參考:IBM DeveloperWorks《Spring 核心原理深度解析》
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved