Spring 整體架構視角


**核心三角**:**Core(工具箱)** + **Beans(原料)** + **Context(舞臺)** = 運行時 Spring 容器。
Bean 組件深度解析
包位置
`org.springframework.beans`
三大職責
- Bean 定義:`BeanDescription` 封裝 `` 節點所有信息(類名、屬性、構造參數、依賴、作用域、初始化/銷毀方法等)
- Bean 創建:工廠模式,頂級接口 `BeanFactory`,核心實現 `DefaultListableBeanFactory`
- Bean 解析:`BeanDefinitionReader` / `BeanDefinitionDocumentReader` 解析 XML/註解/掃描路徑
Context 組件:IoC 容器本體
包位置
`org.springframework.context`
核心接口體系

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

- `ConfigurableApplicationContext`:可刷新、可關閉、可註冊關閉鉤子
- `WebApplicationContext`:Web 環境專用,持有 `ServletContext` 引用
Context 必做四件事
- 標識應用環境(ClassPath/FileSystem/AnnotationConfig/Web)
- 委託 BeanFactory 創建 Bean 實例
- 維護 Bean 依賴關系圖(IoC 容器本質)
- 發布/監聽容器事件(ContextRefreshedEvent 等)
Core 組件:資源抽象與工具箱
Resource 體系

- 統一抽象:`ClassPathResource`、`FileSystemResource`、`ServletContextResource`、`UrlResource`、`InputStreamResource`、`ByteArrayResource`
- 核心方法:`getInputStream()`、`exists()`、`getFile()`、`getURL()`、`getDescription()`
- 屏蔽資源來源差異,Context 委託 `ResourcePatternResolver` 完成加載/解析/定義一體化
IoC 容器啟動流程精簡
- 創建 BeanFactory:`DefaultListableBeanFactory` 實例化
- 載入 Bean 定義:`XmlBeanDefinitionReader` / `ClassPathBeanDefinitionScanner` 解析配置 → `BeanDefinition` 註冊到 BeanFactory
- 實例化單例 Bean:`preInstantiateSingletons()` 遍歷 BeanDefinition → `getBean()` → 創建實例、屬性填充、初始化回調、註冊銷毀回調
- 發布容器就緒事件:`ContextRefreshedEvent` 通知監聽器
Bean 生命周期完整鏈路
實例化
↓
屬性填充 (依賴注入)
↓
Aware 接口回調 (BeanNameAware, BeanFactoryAware, ApplicationContextAware...)
↓
BeanPostProcessor.postProcessBeforeInitialization
↓
InitializingBean.afterPropertiesSet / @PostConstruct / init-method
↓
BeanPostProcessor.postProcessAfterInitialization ← 代理對象在此生成(AOP)
↓
註冊銷毀回調 (DisposableBean / @PreDestroy / destroy-method)
↓
容器關閉時調用銷毀方法
類比總結
若 Bean 是**演員**,Context 是**舞臺**,Core 就是**道具組**。
舞臺負責發現演員、安排關系、提供燈光音效(事件/資源/國際化),道具組提供劇本解析、換裝道具(資源抽象/工具類)。
沒有舞臺,演員無處表演;沒有道具,舞臺無法運轉。
學習建議
- 先理解 **IoC 思想**(控制反轉/依賴注入),再看源碼實現
- 重點掌握 **BeanDefinition → BeanFactory → ApplicationContext** 三層遞進關系
- 動手調試 `BeanPostProcessor` 切點,體會 AOP 代理生成時機
- 參考:IBM DeveloperWorks《Spring 核心原理深度解析》