Spring AOP 从原理到实战(结合事务彻底搞懂)
一、前言在后端开发中我们经常会遇到这种需求打日志统计接口耗时权限校验事务控制如果全部写在业务代码里会变成public void register() { log.info(开始执行); long start System.currentTimeMillis(); try { // 业务逻辑 } catch (Exception e) { log.error(异常); throw e; } log.info(耗时 (System.currentTimeMillis() - start)); } 问题代码重复业务逻辑被污染难维护二、什么是 AOPAOP 在不修改原代码的情况下在方法执行前后插入逻辑三、AOP 的核心思想结合事务理解在没有 AOP 时Controller → UserServiceImpl使用 AOP 后Controller → Proxy代理对象 → UserServiceImpl Proxy 做了什么方法前 → 加逻辑 方法后 → 加逻辑 异常时 → 加逻辑 这就是 AOP通过代理对象在方法前后织入增强逻辑四、AOP 与事务的关系重点Transactional ↓ Spring 识别 ↓ 生成 Proxy ↓ 方法执行前 → begin 方法执行后 → commit 异常 → rollback 结论事务本质就是AOP 的一个应用五、AOP 核心概念必须掌握1️⃣ 切面Aspect 你写的增强逻辑类Aspect Component public class LogAspect {}2️⃣ 切点Pointcut 指定拦截哪些方法execution(* com.xxx.service..*.*(..))3️⃣ 通知Advice 在什么时候执行注解含义Before方法前After方法后不管成功失败AfterReturning方法成功后AfterThrowing方法异常Around包一层最强六、AOP 实战最小可运行1️⃣ 引入依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-aop/artifactId /dependency2️⃣ 写切面Aspect Component public class LogAspect { Before(execution(* org.example.arkbackend.service..*.*(..))) public void before() { System.out.println(方法执行前); } }3️⃣ 测试效果方法执行前 执行注册逻辑七、Around核心能力Around(execution(* org.example.arkbackend.service..*.*(..))) public Object around(ProceedingJoinPoint pjp) throws Throwable { long start System.currentTimeMillis(); try { Object result pjp.proceed(); // 执行目标方法 long cost System.currentTimeMillis() - start; System.out.println(耗时 cost); return result; } catch (Throwable e) { long cost System.currentTimeMillis() - start; System.out.println(异常耗时 cost); throw e; } } 核心pjp.proceed(); 表示执行真正的业务方法八、切点表达式详解重点execution(* org.example.arkbackend.service..*.*(..))含义* → 任意返回值 service → 包路径 .. → 包含子包 * → 任意类 * → 任意方法 (..) → 任意参数 结论拦截 service 包及其子包下所有方法九、AOP 执行顺序面试重点多个切面会形成切面链Advisor Chain执行顺序由Order(1)控制数字越小越先执行推荐顺序日志外层 ↓ 事务内层 ↓ 方法 否则可能耗时统计不准确异常处理异常十、AOP 使用建议工程经验❌ 不要全部用 Around✅ 推荐用法场景用法打日志Before返回值处理AfterReturning异常日志AfterThrowing控制流程Around 原则能简单就不用复杂十一、常见坑必须知道❌ 切点路径写错service.*.* ❌ service..*.* ✅❌ 没加依赖spring-boot-starter-aop❌ 忘记 Component❌ 同类调用不生效同事务十二、总结AOP 本质是通过代理在方法执行前后织入增强逻辑事务就是基于 AOP 实现的典型应用在实际开发中应根据需求选择合适的通知类型而不是滥用 Around最后一句学会 AOP不是为了写注解而是为了把“重复逻辑抽离出来”
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2550409.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!