Spring 的 IOC 和 AOP 是整个 Spring 体系的两大基石,可以用一句话概括:
IOC 解决“对象怎么来、谁来管”,AOP 解决“功能如何在不改代码的情况下统一增强”。
下面按“原理 + 底层实现 + 面试说法”给你一套完整理解。
一、IOC(Inversion of Control:控制反转)
1. 核心思想
原来:
对象自己 new 依赖对象(程序控制对象创建)
IOC 后:
对象由 Spring 容器创建和管理,依赖由容器注入
也就是:
对象的创建权、依赖管理权从程序转移到容器。
2. IOC 的实现机制
核心技术:反射 + 工厂模式 + 依赖注入(DI)
流程:
- 启动时扫描 Bean
- 解析依赖关系(@Autowired / @Resource / 构造器)
- 实例化对象
- 依赖注入
- 生命周期管理(初始化、销毁、单例池)
本质结构:
BeanDefinition(元数据)
↓
BeanFactory / ApplicationContext
↓
实例化 + 依赖注入 + 生命周期回调
3. IOC 解决了什么问题?
- 解耦(不依赖具体实现)
- 统一管理对象生命周期
- 方便扩展与测试(Mock、替换实现)
二、AOP(Aspect Oriented Programming:面向切面编程)
1. 核心思想
把横切关注点从业务逻辑中剥离:
- 事务
- 日志
- 权限
- 监控
- 缓存
- 链路追踪
实现方式:
在不修改业务代码的情况下,动态给方法织入增强逻辑。
2. AOP 的底层原理
核心技术:动态代理
两种实现:
| 方式 | 原理 |
|---|---|
| JDK 动态代理 | 基于接口,生成 Proxy 类 |
| CGLIB 代理 | 基于继承,生成子类字节码 |
织入时机:
- Bean 创建完成后
- 初始化阶段由 BeanPostProcessor 生成代理对象
- 容器中放的是 代理对象而不是原始对象
3. AOP 执行流程(方法调用)
调用代理对象方法
↓
执行前置通知(Before)
↓
执行目标方法
↓
执行后置通知(After / AfterReturning)
↓
异常通知(AfterThrowing)
↓
环绕通知(Around 包裹整个调用)
三、IOC 与 AOP 的关系
1. AOP 是构建在 IOC 之上的
- IOC 负责创建 Bean
- AOP 在 Bean 创建后“加工”Bean(代理增强)
- 最终放入容器的是 代理对象
2. 三层关系图
Spring 容器
├─ IOC:创建对象、注入依赖
└─ AOP:对对象进行功能增强(代理)
可以理解为:
IOC 是地基,AOP 是在地基上搭的“外挂系统”。
四、在真实工程里的例子(你做的订单系统)
IOC 场景
@Service
class OrderService {
@Autowired
private OrderMapper mapper;
}
- OrderService 不关心 mapper 怎么创建
- 容器负责实例化、注入、管理
AOP 场景
@Transactional
public void createOrder() { ... }
底层实际执行的是:
代理对象.createOrder()
→ 开启事务
→ 调用真实方法
→ 提交/回滚事务
五、面试标准回答模板
IOC 是 Spring 的核心容器机制,通过依赖注入将对象的创建和依赖管理交由容器完成,实现解耦和生命周期统一管理;AOP 是在 IOC 基础上的功能增强机制,通过动态代理在运行期对 Bean 进行横切逻辑织入,如事务、日志、权限等。IOC 负责“对象的产生和组装”,AOP 负责“对象行为的增强”,两者共同构成 Spring 框架的核心能力。