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

Spring 源碼深度解析:核心接口體系與 Bean 生命週期管理機制

     編輯:Java 綜合教學

Spring 源碼深度解析:核心接口體系與 Bean 生命週期管理機制

Spring IoC 容器的核心實現圍繞 BeanFactory 接口體系展開,通過層層接口分工實現別名管理、單例註冊、FactoryBean 支持、容器層級配置等核心職責。本文梳理關鍵接口與類的職責邊界與協作關係。

核心接口體系架構

BeanFactory (IOC 容器根接口)
├── HierarchicalBeanFactory (父子容器支持)
│   └── ConfigurableBeanFactory (容器配置能力)
├── AliasRegistry (別名註冊)
│   └── SimpleAliasRegistry (別名實現 + canonicalName 查找)
├── SingletonBeanRegistry (單例註冊查詢)
│   └── DefaultSingletonBeanRegistry (單例生命週期 + 循環依賴 + 銷毀)
│       └── FactoryBeanRegistrySupport (FactoryBean 支持)
│           └── AbstractBeanFactory (BeanFactory 抽象實現)

四大核心職責詳解

1. 別名管理:AliasRegistry & SimpleAliasRegistry

核心數據結構:ConcurrentHashMap<String, String> aliasMap (alias → canonicalName)

  • registerAlias(name, alias):註冊別名,檢查循環引用
  • removeAlias(alias):移除別名
  • isAlias(name):判斷是否為別名
  • getAliases(name):遞歸獲取所有別名 (含別名的別名)
  • resolveAliases(valueResolver):批量解析別名占位符
  • canonicalName(name):遞歸查找原始類名

線程安全:ConcurrentHashMap 保證並發讀寫安全。

2. 單例註冊服務:SingletonBeanRegistry (接口定義)

定義基礎單例操作,不包含 初始化回調、FactoryBean 處理、別名轉換:

  • registerSingleton(beanName, singletonObject):手動註冊已初始化實例
  • getSingleton(beanName):僅獲取已完成初始化的單例
  • containsSingleton(beanName):判斷是否已實例化
  • getSingletonNames() / getSingletonCount():統計信息

設計意圖:為手動註冊的單例提供極簡訪問,不干擾容器管理的 Bean 生命週期。

3. 單例生命週期管理:DefaultSingletonBeanRegistry (核心實現)

四大核心緩存:

緩存KeyValue用途
singletonObjectsbeanName單例實例成熟單例池
singletonFactoriesbeanNameObjectFactory早期暴露引用 (解決循環依賴)
earlySingletonObjectsbeanName早期單例實例循環依賴中間態
registeredSingletonsSet<beanName>-已註冊單例名單

互斥關係:singletonObjects 與 singletonFactories/earlySingletonObjects 互斥,對象只能在一個緩存中存在。

循環依賴檢測與鎖控制:

  • singletonsCurrentlyInCreation:正在創建的 Bean 集合 (標識循環依賴)
  • inCreationCheckExclusions:允許並發創建的白名單
  • beforeSingletonCreation() / afterSingletonCreation():創建前後標記

依賴管理:三個 Map 維護依賴圖

  • containedBeanMap:依賴者 → 被依賴者集合
  • dependentBeanMap:被依賴者 → 依賴者集合
  • dependenciesForBeanMap:被依賴者 → 依賴者集合 (反向)

銷毀流程:destroySingletons() 逆序調用 DisposableBean.destroy() / destroy-method。

4. FactoryBean 支持:FactoryBeanRegistrySupport

三大核心概念協作:

  1. FactoryBean<T>:T getObject() 工廠方法,支持複雜對象構建、單例/原型模式切換
  2. BeanPostProcessor:初始化前後增強
    • postProcessBeforeInitialization:在 afterPropertiesSet / init-method 之前
    • postProcessAfterInitialization:在初始化方法 之後
  3. AccessController (JDK 安全):doPrivileged 臨時提權執行 factory.getObject(),用於安全管理器環境下受限操作

典型代碼模式:

if (System.getSecurityManager() != null) {
    AccessControlContext acc = getAccessControlContext();
    object = AccessController.doPrivileged(
        (PrivilegedExceptionAction<Object>) () -> factory.getObject(), acc);
} else {
    object = factory.getObject();
}

AbstractBeanFactory 核心模板方法

doGetBean() 統一入口,流程:

  1. 轉換 beanName (別名 → 規範名,FactoryBean & 前綴處理)
  2. 檢查緩存 (getSingleton)
  3. 原型模式創建 (createBean)
  4. 單例模式:getSingleton(beanName, () -> createBean(...)) 雙重檢查鎖
  5. 類型檢查、依賴檢查、後處理器回調

關鍵設計模式應用

  • 模板方法:AbstractBeanFactory 定義 getBean 骨架,子類實現 createBean
  • 策略模式:InstantiationStrategy (CGLIB/反射)、PropertyValues 處理
  • 觀察者模式:BeanPostProcessor 生命週期攔截
  • 工廠模式:FactoryBean 封裝複雜構建邏輯
  • 單例模式:容器級單例緩存管理

源碼閱讀建議:從 ClassPathXmlApplicationContext 構造器入口 → refresh() → finishBeanFactoryInitialization() → preInstantiateSingletons() → getBean() 追蹤主流程,再深入各子模塊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved