Spring IoC 容器的核心實現圍繞 BeanFactory 接口體系展開,通過層層接口分工實現別名管理、單例註冊、FactoryBean 支持、容器層級配置等核心職責。本文梳理關鍵接口與類的職責邊界與協作關係。
BeanFactory (IOC 容器根接口) ├── HierarchicalBeanFactory (父子容器支持) │ └── ConfigurableBeanFactory (容器配置能力) ├── AliasRegistry (別名註冊) │ └── SimpleAliasRegistry (別名實現 + canonicalName 查找) ├── SingletonBeanRegistry (單例註冊查詢) │ └── DefaultSingletonBeanRegistry (單例生命週期 + 循環依賴 + 銷毀) │ └── FactoryBeanRegistrySupport (FactoryBean 支持) │ └── AbstractBeanFactory (BeanFactory 抽象實現)
核心數據結構:ConcurrentHashMap<String, String> aliasMap (alias → canonicalName)
registerAlias(name, alias):註冊別名,檢查循環引用removeAlias(alias):移除別名isAlias(name):判斷是否為別名getAliases(name):遞歸獲取所有別名 (含別名的別名)resolveAliases(valueResolver):批量解析別名占位符canonicalName(name):遞歸查找原始類名線程安全:ConcurrentHashMap 保證並發讀寫安全。
定義基礎單例操作,不包含 初始化回調、FactoryBean 處理、別名轉換:
registerSingleton(beanName, singletonObject):手動註冊已初始化實例getSingleton(beanName):僅獲取已完成初始化的單例containsSingleton(beanName):判斷是否已實例化getSingletonNames() / getSingletonCount():統計信息設計意圖:為手動註冊的單例提供極簡訪問,不干擾容器管理的 Bean 生命週期。
四大核心緩存:
| 緩存 | Key | Value | 用途 |
|---|---|---|---|
| singletonObjects | beanName | 單例實例 | 成熟單例池 |
| singletonFactories | beanName | ObjectFactory | 早期暴露引用 (解決循環依賴) |
| earlySingletonObjects | beanName | 早期單例實例 | 循環依賴中間態 |
| registeredSingletons | Set<beanName> | - | 已註冊單例名單 |
互斥關係:singletonObjects 與 singletonFactories/earlySingletonObjects 互斥,對象只能在一個緩存中存在。
循環依賴檢測與鎖控制:
singletonsCurrentlyInCreation:正在創建的 Bean 集合 (標識循環依賴)inCreationCheckExclusions:允許並發創建的白名單beforeSingletonCreation() / afterSingletonCreation():創建前後標記依賴管理:三個 Map 維護依賴圖
containedBeanMap:依賴者 → 被依賴者集合dependentBeanMap:被依賴者 → 依賴者集合dependenciesForBeanMap:被依賴者 → 依賴者集合 (反向)銷毀流程:destroySingletons() 逆序調用 DisposableBean.destroy() / destroy-method。
三大核心概念協作:
T getObject() 工廠方法,支持複雜對象構建、單例/原型模式切換postProcessBeforeInitialization:在 afterPropertiesSet / init-method 之前postProcessAfterInitialization:在初始化方法 之後doPrivileged 臨時提權執行 factory.getObject(),用於安全管理器環境下受限操作典型代碼模式:
if (System.getSecurityManager() != null) {
AccessControlContext acc = getAccessControlContext();
object = AccessController.doPrivileged(
(PrivilegedExceptionAction<Object>) () -> factory.getObject(), acc);
} else {
object = factory.getObject();
}
doGetBean() 統一入口,流程:
getSingleton)createBean)getSingleton(beanName, () -> createBean(...)) 雙重檢查鎖AbstractBeanFactory 定義 getBean 骨架,子類實現 createBeanInstantiationStrategy (CGLIB/反射)、PropertyValues 處理BeanPostProcessor 生命週期攔截FactoryBean 封裝複雜構建邏輯源碼閱讀建議:從
ClassPathXmlApplicationContext構造器入口 →refresh()→finishBeanFactoryInitialization()→preInstantiateSingletons()→getBean()追蹤主流程,再深入各子模塊。