简单介绍SpringAOP

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 个这样的业务方法,你会面临两个困境:

  1. 代码冗余:每个方法都要写一遍计时、日志,改一处要改 N 处;
  2. 关注点分散:开发者写核心业务时,还要兼顾这些非业务逻辑,无法专注。

AOP 正是为解决这个问题而生 ------将与核心业务无关的 "交叉代码"(如日志、事务、安全)独立抽取成 "切面",再以 "横向交叉" 的方式植入业务流程

二、AOP 的核心思想:横向切面 vs 纵向业务

AOP 是对 OOP(面向对象)的补充:OOP 是 "纵向" 的类、继承体系,而 AOP 是 "横向" 的切面,覆盖多个业务流程。

举个形象的例子:

  • 纵向:核心业务一、核心业务二、核心业务三(比如订单生成、用户注册、商品下架);
  • 横向:日志模块、安全模块、事务模块(这些是所有核心业务都需要的交叉逻辑)。

通过 AOP,我们可以把 "日志、事务" 这些切面代码只写一次,然后同时作用于所有核心业务,实现 "一处编写、处处生效"。

三、Spring AOP 的底层实现:动态代理

AOP 的思想需要具体技术来落地,Spring AOP 的底层依赖两种动态代理技术:

  1. JDK 动态代理 :默认对实现了接口的类生效,代理的是接口;
  2. 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?

  1. 代码复用性极强:交叉业务代码只写一次,作用于所有目标方法;
  2. 代码维护成本低:改交叉逻辑只需改切面,不用改所有业务方法;
  3. 开发者更专注核心业务:只需写核心代码,非业务逻辑交给 AOP。

七、总结:一句话理解 AOP

AOP 是将与核心业务无关的交叉代码独立抽取为切面,再以横向交叉的方式应用到业务流程中的编程思想

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

相关推荐
言慢行善14 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
专吃海绵宝宝菠萝屋的派大星14 小时前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟14 小时前
操作系统之虚拟内存
java·服务器·网络
Tong Z14 小时前
常见的限流算法和实现原理
java·开发语言
凭君语未可15 小时前
Java 中的实现类是什么
java·开发语言
He少年15 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
克里斯蒂亚诺更新15 小时前
myeclipse的pojie
java·ide·myeclipse
迷藏49415 小时前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构
迷藏49415 小时前
**发散创新:基于Solid协议的Web3.0去中心化身份认证系统实战解析**在Web3.
java·python·web3·去中心化·区块链
qq_4335021815 小时前
Codex cli 飞书文档创建进阶实用命令 + Skill 创建&使用 小白完整教程
java·前端·飞书