简单介绍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,你写的代码会更优雅、更易维护。

相关推荐
__万波__17 小时前
二十三种设计模式(二十三)--责任链模式
java·设计模式·责任链模式
TT哇17 小时前
基础的IDEA基本使用,如:debug流程、常用快捷键
java·ide·intellij-idea
梵得儿SHI17 小时前
(第七篇)Spring AI 核心技术攻坚:国内模型深度集成与国产化 AI 应用实战指南
java·人工智能·spring·springai框架·国产化it生态·主流大模型的集成方案·麒麟系统部署调优
北辰当尹17 小时前
【实习之旅】Kali虚拟机桥接模式ping通百度
java·服务器·桥接模式
Just Dreamchaser17 小时前
Pdf和Docx文件导出生成水印工具类
java·给pdf和docx文件添加水印
这个需求做不了18 小时前
Java实现文件格式转换(图片,视频,文档,音频)
java
愿你天黑有灯下雨有伞18 小时前
高性能Java并发编程:如何优雅地使用CompletableFuture进行异步编排
java
indexsunny18 小时前
互联网大厂Java面试实战:基于电商场景的Spring Boot与微服务技术问答
java·spring boot·微服务·面试·hibernate·电商场景·技术问答
qq_124987075318 小时前
基于Spring Boot的电影票网上购票系统的设计与实现(源码+论文+部署+安装)
java·大数据·spring boot·后端·spring·毕业设计·计算机毕业设计