Spring AOP
在 Java 开发领域,Spring 框架的 IoC 与 AOP 是两大核心支柱 ------IoC 实现了组件的松耦合,而 **AOP(面向切面编程)** 则解决了 "交叉业务代码冗余" 的痛点。本文将从思想本质、核心术语、底层实现等维度,带你彻底搞懂 Spring AOP。
一、为什么需要 AOP?------ 从业务痛点说起
假设你正在开发一个电商系统,核心业务是 "生成订单",代码大概长这样:
java
运行
public void generate() {
// 1. 记录计时开始(非业务代码)
long begin = System.currentTimeMillis();
try {
// 核心业务:模拟生成订单
Thread.sleep(1234);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 2. 核心业务结果输出
System.out.println("订单已生成.");
// 3. 记录计时结束(非业务代码)
long end = System.currentTimeMillis();
System.out.println("耗时"+(end - begin)+"毫秒");
}
这段代码的问题很明显:计时、日志、事务等 "交叉业务代码",和 "生成订单" 的核心业务代码混在一起了。
如果系统中有 10 个、100 个这样的业务方法,你会面临两个困境:
- 代码冗余:每个方法都要写一遍计时、日志,改一处要改 N 处;
- 关注点分散:开发者写核心业务时,还要兼顾这些非业务逻辑,无法专注。
AOP 正是为解决这个问题而生 ------将与核心业务无关的 "交叉代码"(如日志、事务、安全)独立抽取成 "切面",再以 "横向交叉" 的方式植入业务流程。
二、AOP 的核心思想:横向切面 vs 纵向业务
AOP 是对 OOP(面向对象)的补充:OOP 是 "纵向" 的类、继承体系,而 AOP 是 "横向" 的切面,覆盖多个业务流程。
举个形象的例子:
- 纵向:核心业务一、核心业务二、核心业务三(比如订单生成、用户注册、商品下架);
- 横向:日志模块、安全模块、事务模块(这些是所有核心业务都需要的交叉逻辑)。
通过 AOP,我们可以把 "日志、事务" 这些切面代码只写一次,然后同时作用于所有核心业务,实现 "一处编写、处处生效"。
三、Spring AOP 的底层实现:动态代理
AOP 的思想需要具体技术来落地,Spring AOP 的底层依赖两种动态代理技术:
- JDK 动态代理 :默认对实现了接口的类生效,代理的是接口;
- CGLIB 动态代理 :对没有实现接口的类生效,通过生成目标类的子类来代理。
Spring 会自动切换这两种代理方式,你也可以通过配置强制使用 CGLIB。
四、AOP 七大核心术语:一次搞懂所有概念
理解 AOP 必须先掌握这 7 个术语,结合代码和图示会更清晰:

1. 连接点(Joinpoint)
程序执行流程中可以织入切面的位置 ,比如方法执行前、执行后、抛出异常后等。你可以把它理解为:业务流程中的 "位置"。
2. 切点(Pointcut)
程序执行流程中真正织入切面的方法 (一个切点对应多个连接点)。简单说:切点是 "要增强的方法" (比如generate()方法),而切点表达式可以匹配多个方法(比如所有*Service类的方法)。
3. 通知(Advice)
要织入的具体代码(即交叉业务逻辑),分为 5 种类型:
- 前置通知:方法执行前执行;
- 后置通知:方法执行后执行;
- 环绕通知:方法执行前后都执行(可以控制方法是否执行);
- 异常通知:方法抛出异常时执行;
- 最终通知:无论方法是否正常执行,都会执行(类似
finally)。
4. 切面(Aspect)
切点 + 通知的组合,是 AOP 的核心组件(比如 "计时切面"= "所有 Service 方法" + "计时代码")。
5. 织入(Weaving)
把通知应用到目标对象的过程 (比如把计时代码加到generate()方法上)。
6. 目标对象(Target)
被织入通知的原始业务对象 (比如OrderService类的实例)。
7. 代理对象(Proxy)
织入通知后,生成的新对象(业务代码实际调用的是这个代理对象)。

五、术语关系图示:让概念更直观
用一张图总结术语之间的关系:
- 业务流程是纵向的,包含多个 "连接点"(位置);
- 切面是横向的,通过 "切点"(方法)找到业务流程中的位置,再把 "通知"(代码)织入进去。

六、AOP 的优点:为什么要学 AOP?
- 代码复用性极强:交叉业务代码只写一次,作用于所有目标方法;
- 代码维护成本低:改交叉逻辑只需改切面,不用改所有业务方法;
- 开发者更专注核心业务:只需写核心代码,非业务逻辑交给 AOP。
七、总结:一句话理解 AOP
AOP 是将与核心业务无关的交叉代码独立抽取为切面,再以横向交叉的方式应用到业务流程中的编程思想。

它是 Spring 框架的灵魂之一,也是企业级开发中 "解耦、复用" 的关键技术 ------ 掌握 AOP,你写的代码会更优雅、更易维护。