Spring IOC原理

0 阅读1分钟

一、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 + 三级缓存 + 反射