Spring IOC与AOP

27 阅读3分钟

Spring 的 IOCAOP 是整个 Spring 体系的两大基石,可以用一句话概括:

IOC 解决“对象怎么来、谁来管”,AOP 解决“功能如何在不改代码的情况下统一增强”。

下面按“原理 + 底层实现 + 面试说法”给你一套完整理解。


一、IOC(Inversion of Control:控制反转)

1. 核心思想

原来:

对象自己 new 依赖对象(程序控制对象创建)

IOC 后:

对象由 Spring 容器创建和管理,依赖由容器注入

也就是:

对象的创建权、依赖管理权从程序转移到容器。


2. IOC 的实现机制

核心技术:反射 + 工厂模式 + 依赖注入(DI)

流程:

  1. 启动时扫描 Bean
  2. 解析依赖关系(@Autowired / @Resource / 构造器)
  3. 实例化对象
  4. 依赖注入
  5. 生命周期管理(初始化、销毁、单例池)

本质结构:

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 框架的核心能力。