Spring 框架作為 Java 企業級開發的基石,其設計哲學與架構演進深刻影響了現代軟體工程。本文將從核心組件協作、IoC 容器運作機制、AOP 實現原理及設計模式應用四個維度,系統闡述 Spring 的骨架架構與設計智慧。
Spring 擁有超過十個模組,但真正構成骨架的僅有三大核心組件:Core(核心)、Context(上下文)與 Beans(Bean 容器)。這三者如同戲劇的三要素:
圖 1. Spring 框架整體架構圖
Spring 的設計靈感源自 Java 的 OOP 思想。正如 Object 之於 OOP,Bean 之於 Spring。框架通過將對象包裝為 Bean,在 IoC 容器中統一管理依賴關係,實現了「將對象間的依賴關係轉移到配置文件中管理」的核心目標——依賴注入(DI)。
這種設計遵循「構建數據結構 → 定義運行環境 → 規範生命週期 → 實現組件通訊」的通用框架設計範式,為後續軟體架構設計提供了經典參考。
Beans 組件位於 org.springframework.beans 包,職責涵蓋 Bean 定義、創建與解析。其核心介面 BeanFactory 採用經典工廠模式,衍生出三大子介面:
ListableBeanFactory:可列舉的 Bean 集合HierarchicalBeanFactory:具備父子層級關係的 BeanAutowireCapableBeanFactory:支援自動裝配規則最終實現類 DefaultListableBeanFactory 整合所有介面功能。多介面設計實為針對不同使用場景的權限控制與功能分層。
圖 2. BeanFactory 繼承關係圖
Context 組件(org.springframework.context)以 ApplicationContext 為核心,繼承 BeanFactory 並擴展五大介面:
ResourceLoader:統一資源訪問入口ApplicationEventPublisher:事件發布機制MessageSource:國際化支援HierarchicalBeanFactory:層級化 Bean 管理ListableBeanFactory:Bean 列舉能力其子類 AbstractRefreshableApplicationContext 實現容器刷新機制,WebApplicationContext 則適配 Servlet 環境。
Core 通過 Resource 介面統一封裝各類資源(文件、Classpath、URL、InputStream),配合 ResourceLoader 實現資源加載的策略模式。ResourcePatternResolver 作為協調者,整合資源加載、解析與描述,為上層組件提供統一訪問接口。
圖 3. Resource 相關類結構圖
容器構建入口在 AbstractApplicationContext.refresh(),核心流程包含四大階段:
obtainFreshBeanFactory() → refreshBeanFactory() 創建 DefaultListableBeanFactory 並加載 Bean 定義BeanFactoryPostProcessor、BeanPostProcessor、事件監聽器等preInstantiateSingletons() 遍歷 Bean 定義,處理 FactoryBean 等特殊類型ContextRefreshedEvent
圖 4. BeanFactory 創建時序圖
| 擴展點 | 觸發時機 | 核心方法 | 應用場景 |
|---|---|---|---|
| BeanFactoryPostProcessor | BeanFactory 構建後、Bean 實例化前 | postProcessBeanFactory() | 修改 Bean 定義元數據(如 PropertyPlaceholderConfigurer) |
| BeanPostProcessor | Bean 實例化前後 | postProcessBefore/AfterInitialization() | AOP 代理創建、依賴檢查、自定義初始化邏輯 |
| InitializingBean / DisposableBean | Bean 初始化/銷毀階段 | afterPropertiesSet() / destroy() | 資源獲取與釋放、生命週期回調 |
| FactoryBean | 獲取 Bean 實例時 | getObject() | 複雜對象創建邏輯封裝(如 DataSource、SessionFactory) |
Spring AOP 基於 JDK 動態代理與 CGLIB 字節碼生成,核心流程:
ProxyFactoryBean(實現 FactoryBean)定義代理配置MethodInterceptor)在 InvocationHandler.invoke() 中織入橫切邏輯Advisor(切點+通知)實現精準切面定位
圖 5. Spring 代理對象生成時序圖
Spring 代理對象結構:
$Proxy 實現 Target Interface + SpringProxy + Advised,持有 InvocationHandler 引用目標對象,實現透明攔截。
ProxyFactoryBean 根據配置決策AopProxy 介面JdkDynamicAopProxy / Cglib2AopProxy通過 ProxyConfig 封裝配置參數,實現運行時代理策略的靈活切換。
AbstractApplicationContext.refresh() 定義容器啟動骨架ApplicationEventMulticaster 實現事件廣播BeanWrapper 增強 Bean 屬性訪問能力Spring 的設計精髓在於:
這種「最小核心 + 標準擴展 + 模式驅動」的架構哲學,不僅成就了 Spring 生態的繁榮,更為框架設計、中間件開發、系統架構演進提供了寶貴的方法論指導。