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

SpringBoot AOP切面编程精讲:实现方式、Spring区别及与自定义注解生产实战

文章目录

    • 一、AOP核心简介
    • 二、SpringBoot快速实现AOP(注解版)
      • 1. 引入核心依赖
      • 2. 编写切面类(五种通知完整示例)
      • 3. 测试接口
      • 4. 通知执行顺序
    • 三、传统Spring AOP vs SpringBoot AOP核心区别
      • 1. 核心差异汇总
    • 四、SpringBoot AOP切面 vs 自定义注解(生产重点)
      • 1. 核心关系
      • 2. 两种方式对比
    • 五、实战1:纯AOP全局拦截(仅演示,不推荐生产)
    • 六、实战2:AOP+自定义注解(生产标准写法)
      • 1. 创建自定义标记注解
      • 2. 切面拦截该注解
      • 3. 业务接口按需使用
    • 七、最终生产总结

一、AOP核心简介

AOP(面向切面编程)是Spring两大核心之一,核心作用就是不改动业务代码,就能对方法做统一增强,实现业务逻辑与公共逻辑解耦。常用于统一日志、接口耗时统计、权限校验、事务管理、操作记录等场景。

核心四要素:切点(要拦截哪些方法)、切面(增强处理类)、通知(前后/环绕/异常等增强逻辑)、连接点(被拦截的目标方法)。

二、SpringBoot快速实现AOP(注解版)

1. 引入核心依赖

SpringBoot无需繁琐配置,仅需引入AOP启动器,自动完成装配。

<!-- SpringBoot AOP核心依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2. 编写切面类(五种通知完整示例)

@Aspect标记切面类,@Component交给容器管理,通过切点匹配目标方法,配置不同通知完成增强。

importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.*;importorg.springframework.stereotype.Component;@Aspect@ComponentpublicclassLogAndTimeAspect{// 切点:拦截controller包下所有方法@Pointcut("execution(* com.example.demo.controller.*.*(..))")publicvoidcontrollerPointCut(){}// 前置通知:方法执行前@Before("controllerPointCut()")publicvoidbeforeAdvice(){System.out.println("【前置通知】方法开始执行");}// 后置通知:无论是否异常,执行完毕都执行@After("controllerPointCut()")publicvoidafterAdvice(){System.out.println("【后置通知】方法执行结束");}// 返回通知:方法正常返回后执行@AfterReturning(pointcut="controllerPointCut()",returning="result")publicvoidafterReturningAdvice(Objectresult){System.out.println("【返回通知】返回值:"+result);}// 异常通知:方法报错时执行@AfterThrowing(pointcut="controllerPointCut()",throwing="e")publicvoidafterThrowingAdvice(Exceptione){System.out.println("【异常通知】异常信息:"+e.getMessage());}// 环绕通知:功能最强,手动控制方法执行前后逻辑@Around("controllerPointCut()")publicObjectaroundAdvice(ProceedingJoinPointjoinPoint)throwsThrowable{longstartTime=System.currentTimeMillis();// 执行目标方法Objectresult=joinPoint.proceed();longendTime=System.currentTimeMillis();System.out.println("【环绕通知】方法耗时:"+(endTime-startTime)+"ms");returnresult;}}

3. 测试接口

@RestControllerpublicclassAopTestController{@GetMapping("/aop/test")publicStringaopTest(){System.out.println("业务方法执行中");return"AOP执行成功";}}

4. 通知执行顺序

正常执行:环绕前置 → 前置通知 → 目标方法 → 返回通知 → 后置通知 → 环绕后置

异常执行:环绕前置 → 前置通知 → 方法报错 → 异常通知 → 后置通知

三、传统Spring AOP vs SpringBoot AOP核心区别

两者底层原理、切点规则、通知逻辑完全一样,核心区别仅在配置和使用方式。

1. 核心差异汇总

  • 配置方式:Spring AOP必须写XML配置,繁琐冗余;SpringBoot AOP零XML,纯注解开箱即用。

  • 依赖管理:Spring需手动导入多个Jar、处理版本冲突;SpringBoot只需一个启动器,自动管控版本。

  • 代理开启:Spring需手动配置AOP自动代理标签;SpringBoot默认自动开启,无需手动配置。

  • 适用场景:Spring AOP仅用于老旧SSM项目维护;SpringBoot AOP是新项目、微服务标配。

四、SpringBoot AOP切面 vs 自定义注解(生产重点)

1. 核心关系

AOP切面:干活的拦截器,负责方法增强逻辑;自定义注解:标记开关,只负责筛选哪些方法需要拦截。

两者不是二选一,生产标配:AOP切面 + 自定义注解组合使用

2. 两种方式对比

对比维度纯AOP按包名拦截(execution)AOP+自定义注解(精准拦截)
拦截范围全局批量拦截,范围大只拦截加注解的方法,精准可控
误拦截风险高,容易拦截无关方法无,不加注解不生效
适用场景全局耗时、基础统一日志操作日志、权限、限流、数据脱敏
生产推荐少用、不推荐首选、企业标准

五、实战1:纯AOP全局拦截(仅演示,不推荐生产)

按包名一刀切,所有接口都拦截,无法单独控制,容易产生垃圾日志。

@Aspect@ComponentpublicclassAllApiLogAspect{@Pointcut("execution(* com.example.demo.controller.*.*(..))")publicvoidpointcut(){}@Around("pointcut()")publicObjectaround(ProceedingJoinPointjoinPoint)throwsThrowable{System.out.println("接口入参:"+Arrays.toString(joinPoint.getArgs()));Objectresult=joinPoint.proceed();System.out.println("接口出参:"+result);returnresult;}}

六、实战2:AOP+自定义注解(生产标准写法)

1. 创建自定义标记注解

importjava.lang.annotation.*;// 仅标记方法、运行时生效@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceOperateLog{Stringvalue()default"";// 记录操作描述}

2. 切面拦截该注解

@Aspect@ComponentpublicclassOperateLogAspect{// 只拦截加了@OperateLog注解的方法@Pointcut("@annotation(com.example.demo.annotation.OperateLog)")publicvoidoperateLogPointcut(){}@Around("operateLogPointcut()")publicObjectaround(ProceedingJoinPointjoinPoint)throwsThrowable{System.out.println("===== 记录重要操作日志 =====");System.out.println("操作方法:"+joinPoint.getSignature().getName());System.out.println("请求参数:"+Arrays.toString(joinPoint.getArgs()));Objectresult=joinPoint.proceed();System.out.println("操作返回结果:"+result);returnresult;}}

3. 业务接口按需使用

@RestControllerpublicclassUserController{// 普通查询:不加注解 → 不记录日志@GetMapping("/user/get")publicStringgetUser(){return"查询用户";}// 重要操作:加注解 → AOP自动记录日志@OperateLog("删除用户操作")@GetMapping("/user/delete")publicStringdeleteUser(){return"删除成功";}}

七、最终生产总结

  1. 简单全局通用功能,可少量使用纯AOP包名拦截;

  2. 业务特殊增强功能,一律使用AOP+自定义注解,精准可控、好维护;

  3. SpringBoot新项目只用注解AOP,传统Spring XML配置仅作老旧项目维护使用。

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

相关文章:

  • 助睿数智 Uniplore 实验报告|订单利润分流数据加工零代码 ETL 全流程——附完整操作步骤 + 踩坑指南,新手也能一次成功
  • Notepad--:跨平台国产文本编辑器的完整指南与高效使用技巧
  • GLA与GDN注意力机制对比:长序列建模的效率与性能优化
  • LeetCode 72. 编辑距离:动态规划经典题解
  • 深入探索水下机器人仿真:专业级ROS平台实战指南
  • 三步解决B站直播弹幕显示难题:BLiveChat让OBS互动更专业
  • Translumo屏幕实时翻译工具终极指南:5分钟掌握高效跨语言沟通技巧
  • PhysMaster:基于强化学习的物理合理视频生成技术解析
  • 体验Taotoken多模型聚合路由带来的服务稳定性提升
  • 别再只用WebRTC了!用LiveKit Server + Go 手把手搭建一个低延迟的Web音视频聊天室
  • 基于Logistic98/chatgpt-fine-tuning项目的GPT模型微调实战指南
  • 保姆级教程:用VMware Workstation 17在Windows电脑上体验macOS Monterey(附AMD CPU避坑配置)
  • Apollo Save Tool:终极PS4存档管理解决方案,轻松备份和修改游戏进度
  • 如何在3分钟内为Windows 11 LTSC系统安装微软商店:终极完整指南
  • 微信Dat文件的前世今生:从异或加密到WxDatViewer,聊聊数据安全与隐私保护
  • CH582单片机SysTick定时器实战:1秒精准闪烁LED(附串口打印调试技巧)
  • MySQL执行计划优化 = 加索引?
  • 告别纸上谈兵:在浏览器里用MARIE.js写你的第一个汇编程序(含完整代码)
  • 2026届学术党必备的五大AI辅助论文网站推荐
  • Masa Mods汉化资源包:让Minecraft模组界面彻底说中文的完整指南
  • python学习Day12:pandas安装与实际运用
  • 你的手机Wi-Fi跑不满?可能是这3个‘隐形杀手’在作怪(附手机/电脑自查指南)
  • 告别低价陷阱!扬中金展母线槽,工程性价比之选
  • 如何利用Grok 4.3辅助Python编程:完整方法论与高阶提示词库(2026国内开发者实战指南)
  • 抖音视频怎么无水印保存到相册?抖音无水印保存教程2026最新实测全攻略 - 爱上科技热点
  • 豆包视频怎么去水印?豆包视频去水印方法全测评,2026最新 亲测有效 - 爱上科技热点
  • 无人机 大疆 极飞添加自定义高清地图源教程
  • 告别重复介绍!你的专属AI伙伴终于来了
  • 北斗导航 | 基于麻雀搜索算法的接收机自主完好性监测(RAIM)算法研究
  • 机器人算法评估系统:提升测试效率与准确性的关键技术