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 的定义信息(类名、作用域、依赖等)都存储在这里
java
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
(2)注册 BeanDefinition
通过 registerBeanDefinition(beanName, beanDefinition)
方法注册。
java
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
为例:
- 创建容器
java
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
来完成。