news 2026/4/27 1:49:13

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 1:44:19

Spring Boot + 策略模式:增强接口扩展性的最佳实践

一、为什么需要策略模式&#xff1f;在实际业务开发中&#xff0c;经常会遇到一个接口有多种不同实现方式的场景。例如&#xff1a;支付系统&#xff1a;微信支付、支付宝支付、银行卡支付订单折扣&#xff1a;满减、打折、VIP特价文件处理&#xff1a;PDF导出、Excel导出、CSV…

作者头像 李华
网站建设 2026/4/27 1:42:19

Chrome DevTools MCP:基于MCP协议实现浏览器自动化与AI集成

1. 项目概述&#xff1a;一个连接开发者与浏览器调试器的桥梁如果你是一名前端开发者&#xff0c;或者任何需要和浏览器打交道的工程师&#xff0c;那么“Chrome DevTools”这个名字你一定不陌生。它是我们日常开发中不可或缺的“瑞士军刀”&#xff0c;从查看DOM结构、调试Jav…

作者头像 李华
网站建设 2026/4/27 1:33:45

推理优化:大模型高效部署核心技术全解析

随着大语言模型、多模态模型规模持续扩张&#xff0c;AI模型在各类业务场景落地时&#xff0c;推理性能瓶颈愈发凸显。高延迟、低吞吐量、硬件资源利用率不足等问题&#xff0c;直接影响用户体验与业务成本&#xff0c;推理优化成为AI工程化落地的核心环节。本文将从推理基础认…

作者头像 李华
网站建设 2026/4/27 1:31:25

ARM构建工具链配置与优化实战指南

1. ARM构建工具链深度解析在嵌入式开发领域&#xff0c;构建工具链的质量直接决定了最终产品的性能和可靠性。作为ARM架构开发的黄金标准&#xff0c;RealView Debugger提供了一套完整的工具链管理方案&#xff0c;让开发者能够精细控制从源代码到可执行文件的每个环节。1.1 工…

作者头像 李华
网站建设 2026/4/27 1:29:44

深度学习影评情感分析实战:从预处理到模型部署

1. 项目概述&#xff1a;基于深度学习的影评情感分析实战影评情感分析是自然语言处理(NLP)领域的经典文本分类任务。这个项目将带您用深度学习技术构建一个能自动判断电影评论情感倾向&#xff08;正面/负面&#xff09;的分类器。我在实际业务中部署过多个类似系统&#xff0c…

作者头像 李华
网站建设 2026/4/27 1:29:27

顺序特征选择在房价预测模型中的优化实践

1. 项目概述&#xff1a;用顺序特征选择优化房价预测模型在房地产数据分析领域&#xff0c;我们常常面临一个经典难题&#xff1a;当手头有数十个甚至上百个房屋特征指标时&#xff0c;如何确定哪些特征真正影响房价&#xff1f;三年前我在处理某城市二手房数据集时就遇到这种情…

作者头像 李华