一、IOC 是什么?
IOC(Inversion of Control)控制反转。
一句话:
把对象的创建和依赖管理的控制权,从程序员手里交给容器。
传统写法:
UserService service = new UserService();
IOC 之后:
@Autowired
UserService service;
对象由 Spring 创建。
二、Spring 如何实现 IOC?
核心:
BeanFactory
Spring IOC 本质就是:
一个大工厂 + 一个对象缓存池
三、容器启动流程(核心流程)
以 Spring Boot 为例:
SpringApplication.run()
↓
创建 ApplicationContext
↓
refresh()
↓
完成 Bean 的创建和初始化
refresh() 是核心
内部步骤:
1. 加载 BeanDefinition
2. 注册 BeanDefinition
3. 创建 Bean
4. 依赖注入
5. 初始化
四、Bean 创建流程(源码级流程🔥)
当 getBean() 时:
AbstractBeanFactory#doGetBean()
核心调用链:
doGetBean()
↓
createBean()
↓
doCreateBean()
五、doCreateBean() 三步(最核心🔥)
1️⃣ 实例化(构造方法)
2️⃣ 属性填充(依赖注入)
3️⃣ 初始化(回调方法)
1️⃣ 实例化
createBeanInstance()
反射创建对象。
2️⃣ 属性填充
populateBean()
处理:
- @Autowired
- @Value
- setter 注入
3️⃣ 初始化
initializeBean()
包括:
Aware 回调
BeanPostProcessor
@PostConstruct
afterPropertiesSet
init-method
六、IOC 的核心数据结构
1️⃣ BeanDefinition
存储:
- 类名
- 作用域
- 构造参数
- 依赖关系
- 初始化方法
2️⃣ 单例池(三级缓存🔥)
解决循环依赖关键结构:
singletonObjects // 一级缓存
earlySingletonObjects // 二级缓存
singletonFactories // 三级缓存
七、循环依赖怎么解决?
A -> B
B -> A
解决靠:
提前暴露对象引用
流程:
1️⃣ 实例化 A
2️⃣ 放入三级缓存
3️⃣ 注入 B
4️⃣ B 需要 A
5️⃣ 从三级缓存拿到 A 的早期引用
6️⃣ 注入完成
八、Spring IOC 本质总结
Spring IOC 核心就是:
BeanDefinition + BeanFactory + 三级缓存 + 反射