当前位置: 首页 > news >正文

Spring Boot AOP 面向切面编程:从原理到实战,一篇就会

AOP 是 Spring 核心特性之一,也是面试与日常开发高频使用的技能。它能帮我们无侵入地统一处理日志、权限、耗时统计、异常捕获等通用逻辑,大幅减少重复代码、降低耦合。

本文用最通俗的讲解 + 完整可运行案例,带你彻底掌握 Spring Boot AOP。


一、什么是 AOP?为什么要用?

AOP:Aspect Oriented Programming 面向切面编程

核心思想:
核心业务通用非业务逻辑分离开。

  • 核心业务:用户登录、下单、支付
  • 通用逻辑:日志、鉴权、耗时统计、异常处理、事务

不使用 AOP 的问题:

  • 每个方法都写重复代码
  • 业务代码被污染
  • 修改麻烦,牵一发动全身
  • 耦合度极高

AOP 的好处:

  • 无侵入:不修改业务代码
  • 复用强:一处编写,多处生效
  • 易维护:统一修改,全局生效
  • 职责清晰:业务归业务,切面归切面

二、AOP 核心术语(一看就懂)

  • 切面 Aspect:要插入的通用功能(日志、权限等)
  • 切点 Pointcut:在哪些方法上切入(匹配规则)
  • 通知 Advice:在方法前/后/异常/环绕执行什么逻辑
  • 连接点 JoinPoint:可以被切入的目标方法
  • 织入 Weaving:把切面逻辑插入目标方法的过程
  • 目标对象 Target:被代理的业务类

三、AOP 五大通知类型

  1. @Before:方法执行前
  2. @After:方法执行后(无论是否异常)
  3. @AfterReturning:方法正常返回后
  4. @AfterThrowing:方法抛出异常后
  5. @Around:环绕通知(最强大,前后都能控制)

执行顺序:

Around 前 → Before → 方法执行 → AfterReturning → After → Around 后

四、Spring Boot 快速使用 AOP

1. 引入依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>

2. 编写业务类(目标对象)

UserService:

@Service @Slf4j public class UserService { public void printUserInfo(User user) { log.info("用户ID:{}", user.getId()); log.info("用户名:{}", user.getUsername()); log.info("昵称:{}", user.getNickname()); } }

Controller:

@RestController @RequiredArgsConstructor public class UserController { private final UserService userService; @PostMapping("/user") public String print(@RequestBody User user) { userService.printUserInfo(user); return "success"; } }

五、编写切面(核心步骤)

@Aspect @Component @Slf4j public class LogAspect { // 1. 定义切点:匹配 UserService 所有方法 @Pointcut("execution(* com.example.aop.service.UserService.*(..))") public void logPointcut() { } // 2. 前置通知 @Before("logPointcut()") public void before() { log.warn("[前置] 方法即将执行"); } // 3. 后置通知 @After("logPointcut()") public void after() { log.warn("[后置] 方法已执行"); } // 4. 返回通知 @AfterReturning("logPointcut()") public void afterReturning() { log.warn("[返回] 方法正常返回"); } // 5. 异常通知 @AfterThrowing("logPointcut()") public void afterThrowing() { log.error("[异常] 方法报错了"); } }

切点表达式说明

execution(* com.xxx.service.UserService.*(..)) * 任意返回值 .. 任意参数 * 任意方法名

六、环绕通知 @Around(最常用)

环绕通知可以控制目标方法是否执行、修改参数、修改返回值、捕获异常

@Around("logPointcut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { log.warn("[环绕前]"); long start = System.currentTimeMillis(); // 执行目标方法 Object result = joinPoint.proceed(); long end = System.currentTimeMillis(); log.warn("[环绕后] 耗时:{}ms", end - start); return result; }

⚠️ 注意:

  • 必须调用proceed()才会执行目标方法
  • 必须抛出异常或捕获,否则业务异常会被吃掉

七、在通知中获取方法参数

可以在切面中拿到目标方法的入参,常用于日志打印、参数校验。

@Before("logPointcut() && args(user)") public void before(User user) { log.warn("参数:{}", user); }

多参数写法:

@Before("logPointcut() && args(user,id)") public void before(User user, Integer id) { ... }

八、AOP 常见使用场景

  • 接口日志统一打印
  • 方法耗时统计
  • 全局权限校验
  • 全局异常捕获包装
  • 多数据源切换
  • 分布式锁、限流、幂等
  • 缓存自动处理
  • 操作日志审计

九、避坑指南(重要)

  1. 同类内部调用不生效(this.method() 不走代理)
  2. private 方法无法切入(必须是 public)
  3. 异常不要在切面吞掉,要抛出或包装
  4. 环绕通知必须调用 proceed()
  5. 避免切点表达式范围过大(如*.*.*(..))导致性能问题

十、总结

Spring AOP 本质是动态代理,帮我们无侵入增强方法。

使用三步:

  1. 加 AOP 依赖
  2. 写切点(匹配哪些方法)
  3. 写通知(前/后/环绕 增强逻辑)

AOP 让代码更干净、职责更清晰、维护更轻松,是 Spring 开发必备技能。

来自降重鸟技术团队,请勿转载,降重鸟地址https://jcn2.cn

http://www.jsqmd.com/news/706172/

相关文章:

  • Go语言怎么做AES加密_Go语言AES加密解密教程【精选】
  • 基于安卓的快递包裹隐私保护系统毕业设计源码
  • OpenCV中SVM算法原理与图像分类实战
  • 广西广告标识源头厂家哪家好?深度对比TOP10榜单揭晓 - 速递信息
  • AI模型推理沙箱化实践(Docker+gVisor+eBPF三重加固方案)
  • 手把手教你搞定移远EC200U/EC25的Linux驱动:从硬件检查到串口映射的保姆级教程
  • JeecgBoot企业级低代码平台:Spring Boot+Vue3架构解析与实战指南
  • 广西靠谱的标识标牌源头厂家推荐:从案例看巨匠标识的实力 - 速递信息
  • 2026专业上海公考教育推荐榜:上海法考课程、上海公考培训、上海公考教学、上海公考教育机构、上海公考机构、上海公考课程选择指南 - 优质品牌商家
  • 【国家药监局NMPA备案强制要求】:MCP 2026脱敏配置必须启用的3项不可绕过参数(含审计日志生成逻辑)
  • 如何了解imtoken钱包是什么 - 速递信息
  • 2026佛山代运营公司口碑真实测评 佛山短视频代运营最新TOP3榜单 - 速递信息
  • 现代相机成像基本流程
  • OpenContext:为AI编程助手打造持久记忆,实现上下文无缝管理
  • 在语雀客户端中,个人、空间、知识库怎么区分使用
  • redis中缓存穿透,及解决方案
  • 湖南大奥之心:长沙奥迪专修标杆,让每台德系车重焕新生 - 速递信息
  • 2026哈尔滨偏瘫无法行走:哈尔滨偏瘫肢体麻木、哈尔滨偏瘫行动障碍、哈尔滨偏瘫语言障碍、哈尔滨冠心病室上速、哈尔滨冠心病心律不齐选择指南 - 优质品牌商家
  • 中医智能诊疗系统-阶段一
  • DriveBench基准测试:揭示自动驾驶VLM可靠性挑战与评估方法
  • 质量优先:环保移动公厕、移动公厕租赁、连排移动公厕、免水冲移动公厕、单体移动厕所、塑料移动厕所出租、塑料移动厕所租赁选择指南 - 优质品牌商家
  • AI建站工具怎么选:一份中立实用的选型标准与对比指南
  • 2026年地暖技术深度解析:全屋公元家/公元五金/公元优家管/公元优管家/公元公司/公元农业/公元净水/公元品牌/选择指南 - 优质品牌商家
  • 计算机毕业设计:Python金融大数据可视化与LSTM预测系统 Flask框架 深度学习 机器学习 AI 大模型(建议收藏)✅
  • 海能达数字对讲机找哪家 - 速递信息
  • Redis如何通过永不过期策略规避击穿
  • 2026佛山短视频代运营公司实力大比拼 最新佛山代运营榜单TOP4 - 速递信息
  • 一套Unity框架解决所有RPG问题:ORK的系统设计哲学
  • 幼儿识字动画 1000 字 动画
  • 昆明黄金回收怎么不被坑?内行人教你选靠谱实体店 - 速递信息