Spring AOP开发的使用场景

在Spring开发中,凡是「和业务目标无关,但又几乎每个接口/方法都会用到」的逻辑,都可以使用 AOP(切面)进行开发。下面结合 Spring Boot + 微服务 + Redis总结一下AOP 使用清单。

一、最常见 & 最值得做成切面的

1 接口防抖 / 限流

典型特征

  • 和业务无关

  • 每个接口都可能要

  • 策略可变

切面处理的事

  • 解析用户身份

  • 生成 key

  • Redis / Sentinel / Guava 控制频率

扩展方向:

  • 防抖(时间窗内只允许一次)

  • 限流(QPS / 次数)

  • 黑名单 / 灰度


2 接口幂等

防止"同一请求被执行多次"

使用场景

  • 下单

  • 支付回调

  • MQ 消费

  • 表单提交

注解示例:

java 复制代码
@Idempotent(key = "#requestId", expire = 10)

切面做的事

  • 从参数 / header 中取唯一标识

  • Redis SETNX

  • 已存在直接返回结果或报错

和防抖的区别

防抖 幂等
控制时间 控制唯一性
多次点击 多次重试

3 统一日志(接口 / 方法级)

典型痛点

  • 每个接口都写日志

  • 日志格式不统一

  • 排查问题靠猜

切面能力

java 复制代码
@Around("@annotation(ApiLog)")

能做什么

  • 入参

  • 返回值

  • 耗时

  • 用户信息

  • traceId

常见玩法

  • 请求日志

  • 慢接口告警

  • 关键业务审计日志

4. 权限 & 鉴权(比拦截器更精细)

java 复制代码
@RequiresPermission("order:create")

为什么用 AOP 而不是 Interceptor

  • Interceptor 只能拿 URL

  • AOP 能拿方法、注解、参数

切面里可以做

  • 校验 token

  • 校验角色 / 权限

  • 动态 RBAC

5. 参数校验增强(业务校验)

JSR-303 是"格式校验",但很多是业务校验

java 复制代码
@CheckOrderStatus(allow = {CREATED})

切面里:

  • 查数据库

  • 校验状态流转是否合法

  • 不合法直接抛异常

比散落在 service 里清爽得多

6. 分布式锁(极其适合 AOP)

java 复制代码
@DistributedLock(
    key = "#orderId",
    expire = 5,
    waitTime = 1
)

切面逻辑:

  • 加锁

  • 执行业务

  • finally 解锁

常见实现

  • Redis

  • Redisson

7. 事务增强(条件事务 / 手动回滚)

java 复制代码
@CustomTransactional

切面里:

  • 动态决定是否开启事务

  • 捕获异常决定是否回滚

在复杂业务编排中很有用

二、进阶:微服务体系里的 AOP

8. 接口降级 & 熔断(业务级)

java 复制代码
@Fallback(method = "defaultResult")

切面中:

  • try 执行业务

  • catch 异常

  • 自动走兜底逻辑

比 try-catch 散落一地高级太多

9. 接口调用链追踪(TraceId)

java 复制代码
@Trace

切面:

  • 生成 traceId

  • 放入 MDC

  • 自动贯穿日志 / RPC

排查线上问题神器

10. MQ 消费统一处理

java 复制代码
@MqConsume

切面中:

  • 防重复消费

  • 异常重试

  • 失败入库 / 告警

三、什么时候「不适合」用切面

以下情况别硬用 AOP

场景 原因
核心业务流程 可读性差
极端性能敏感 有额外开销
逻辑强依赖返回值 调试困难
需要明确执行顺序 容易踩坑

四、总结

AOP 最适合做的事情:
"删掉它,业务还能跑;
但没有它,系统会很难维护。"

相关推荐
一线大码6 小时前
Gradle 基础篇之基础知识的介绍和使用
后端·gradle
Java猿_6 小时前
Spring Boot 集成 Sa-Token 实现登录认证与 RBAC 权限控制(实战)
android·spring boot·后端
小王师傅666 小时前
【轻松入门SpringBoot】actuator健康检查(上)
java·spring boot·后端
醒过来摸鱼7 小时前
Java classloader
java·开发语言·python
专注于大数据技术栈7 小时前
java学习--StringBuilder
java·学习
loosenivy7 小时前
企业银行账户归属地查询接口如何用Java调用
java·企业银行账户归属地·企业账户查询接口·企业银行账户查询
码事漫谈7 小时前
C++高并发编程核心技能解析
后端
码事漫谈7 小时前
C++与浏览器交织-从Chrome插件到WebAssembly,开启性能之门
后端
IT 行者7 小时前
Spring Security 6.x 迁移到 7.0 的完整步骤
java·spring·oauth2