Spring IoC 核心實現類詳解(源碼+原理)
作為 Spring 的靈魂,IoC 容器(Inversion of Control)是整個框架的核心。
那么 IoC 的“心臟”到底是哪個類?它是怎么管理和裝配 Bean 的?本文將從源碼層面深入剖析。
一、IoC 是什么?
IoC(控制反轉)是 Spring 用來管理對象依賴關系的一種機制。
簡單說,對象不是自己去 new
依賴,而是由容器幫它創建和注入。
在 Spring 中,IoC 的實現依賴于 BeanFactory 和 ApplicationContext 兩大家族的容器接口。
二、IoC 核心實現類
如果追源碼,你會發現 IoC 容器的最終核心實現是:
DefaultListableBeanFactory
它是 Spring 中最通用、功能最完整的 BeanFactory 實現類,幾乎所有 ApplicationContext 都會委托它完成 Bean 的注冊與創建。
1. 繼承體系
DefaultListableBeanFactory
的類層次結構大致如下:
2. 核心職責
DefaultListableBeanFactory
主要做了以下幾件事:
(1)保存 BeanDefinition
- 內部維護一個
Map<String, BeanDefinition>
(beanDefinitionMap) - 所有 Bean 的定義信息(類名、作用域、依賴等)都存儲在這里
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
(2)注冊 BeanDefinition
通過 registerBeanDefinition(beanName, beanDefinition)
方法注冊。
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {this.beanDefinitionMap.put(beanName, beanDefinition);
}
(3)根據 BeanDefinition 創建 Bean
- 支持單例、多例、懶加載、FactoryBean 等
- 會調用 BeanPostProcessor 執行初始化前后回調
- 支持自動注入(byName、byType、構造器)
(4)依賴解析(Autowire)
在 Bean 創建過程中解析依賴,執行自動裝配邏輯(@Autowired、@Resource)。
(5)根據類型或者名稱獲取bean
(6)解決三級緩存依賴問題
繼承了 DefaultSingletonBeanRegistry ,解決了循環依賴問題的
(7)生命周期管理
負責調用 InitializingBean
、DisposableBean
等接口方法。
三、ApplicationContextFactory與 DefaultListableBeanFactory 的關系
ApplicationContextFactory
是更高級別的 IoC 容器創建接口,真正的來說應該是對應的應用上下文的創建工廠,主要提供:
- 上下文應用類型的創建。
ApplicationContextFactory
創建出來的ApplicationContext
內部都會持有一個 DefaultListableBeanFactory
,實際的 Bean 管理還是由 DefaultListableBeanFactory
完成。
四、核心運行流程(簡化)
以 AnnotationConfigApplicationContext
為例:
- 創建容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
-
注冊配置類
調用DefaultListableBeanFactory.registerBeanDefinition()
把AppConfig
注冊進去。 -
解析配置類
通過ConfigurationClassPostProcessor
掃描 @Bean、@Component 等。 -
注冊更多 BeanDefinition
掃描到的類也會被注冊進DefaultListableBeanFactory
。 -
實例化 Bean
調用preInstantiateSingletons()
→ 根據 BeanDefinition 創建單例 Bean。 -
依賴注入 + 初始化回調
執行自動注入、調用初始化方法、BeanPostProcessor 回調等。
五、總結
- 核心類:
DefaultListableBeanFactory
- 職責:保存 BeanDefinition、注冊 BeanDefinition、創建 Bean、依賴注入、生命周期管理
- 關系:
ApplicationContext
只是更高級的外觀模式,底層真正管理 Bean 的還是DefaultListableBeanFactory
六、圖解(IoC 核心結構)
ApplicationContext├── 環境管理(Environment)├── 國際化(MessageSource)├── 事件發布(ApplicationEventPublisher)└── DefaultListableBeanFactory ← 真正的 IoC 容器├── BeanDefinitionMap(存儲 Bean 定義)├── 創建 Bean├── 依賴注入└── 生命周期管理
💡 一句話總結:
在 Spring IoC 中,
DefaultListableBeanFactory
就是“發動機”,
ApplicationContext
則是“外殼 + 控制臺”,
所有 Bean 的注冊、創建和裝配,最終都由DefaultListableBeanFactory
來完成。