【Spring Boot】Spring AOP中的环绕通知 📅 发布时间:2026/7/5 14:15:05 👁️ 浏览次数: 目录一、什么是AOP?二、AOP 的环绕通知2.1 切点以及切点表达式2.2 连接点2.3 通知Advice2.4 切面(Aspect)2.5 不同通知类型的区别2.5.1 正常情况下2.5.2异常情况下2.6 统一管理切点PointCut一、什么是AOPAspect Oriented Programming面向切面编程AOP是Spring框架的第核(第核是IoC)AOP是一种思想是对某一类事情的集中处理。其中在下面的学习中我们会学习到拦截器、统一异常处理统一结果处理等这些都是运用了AOP的统一思想来实现的。拦截器实现AOP思想作用的维度是前端对后端进行的一次请求和一次响应主要是检索前端传来的URL如果检索后返回True则可以进入Controller开始执行代码如果返回的为False则表示失败直接被拦截在外面无法执行代码。统一结果处理则是使用注解ControllerAdvice(通知类注解)实现ResponseBodyAdvice接口对响应的结果进行统一处理对齐进行统一的包装后响应其中如果数据类型为String类型的话要进行特殊处理使用ObjectMapper的方法将String格式转为Json格式再次响应。统一异常处理也是使用注解ControllerAdvice(通知类注解)以及在方法上使用ExceptionHandler注解在全部的程序中如果遇到运行时异常则会自动捕捉进行抛出注编译时异常是写代码过程中出现的不手动解决就无法运行程序。接下来我们要学习的是运用了AOP思想进行AOP的环绕处理二、AOP 的环绕通知2.1 切点以及切点表达式切点通知类型切点表达式切点表示了为该方法提供一组规则来对程序进行功能增强通知类型有以下5种Around:环绕通知,此注解标注的通知方法在目标方法前,后都被执行Before:前置通知,此注解标注的通知方法在目标方法前被执行After:后置通知,此注解标注的通知方法在目标方法后被执行,论是否有异常都会执行AfterReturning:返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行AfterThrowing:异常后通知,此注解标注的通知方法发异常后执行如下图所示在该方法上的Around,表示的是环绕处理是一种通知类型其后面的execution(* com.example.demo.controller..(…)) 表示的是该通知类型作用的范围是切点表达式2.2 连接点满足切点表达式规则的方法就是连接点在该图中public recordTime方法就是连接点2.3 通知Advice通知就是具体要做的内容简单来说就是方法内执行的代码内容如图所示该图中标红的位置就是通知内容在AOP面向切面编程当中,我们把这部分重复的代码逻辑抽取出来单独定义,这部分代码就是通知的内容2.4 切面(Aspect)首先使用注解Aspect来表示该类是一个切面类然后使用不同的通知类型进行处理,如图表示的是环绕通知类型在处理过程中ProceedingJoinPoint.proceed()让原始方法执行切面(Aspect)切点(Pointcut)通知(Advice)以下代码表示一个完整的切面类:import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; Slf4j Aspect Component public class TimeAspect { /** * 记录方法耗时 */ Around(execution(* com.example.demo.controller.*.*(..))) public Object recordTime(ProceedingJoinPoint pjp) throws Throwable { //记录方法执行开始时间 long begin System.currentTimeMillis(); //执行原始方法 Object result pjp.proceed(); //记录方法执行结束时间 long end System.currentTimeMillis(); //记录方法执行耗时 log.info(pjp.getSignature() 执行耗时: {}ms, end - begin); return result; } }2.5 不同通知类型的区别2.5.1 正常情况下环绕通知 Around 标识的通知方法包含两部分,个前置逻辑,个后置逻辑.其中前置逻辑会先于 Before 标识的通知方法执行,后置逻辑会晚于 After 标识的通知方法执行2.5.2异常情况下程序发异常的情况下AfterReturning 标识的通知方法不会执行 AfterThrowing 标识的通知方法执行了Around 环绕通知中原始方法调时有异常通知中的环绕后的代码逻辑也不会在执行了(因为原始方法调出异常了)注意事项:Around 环绕通知需要调 ProceedingJoinPoint.proceed() 来让原始方法执行,其他通知不需要考虑目标方法执行.Around 环绕通知方法的返回值,必须指定为Object,来接收原始方法的返回值,否则原始方法执行完毕,是获取不到返回值的.个切面类可以有多个切点2.6 统一管理切点PointCut统一管理切点就是对于复杂的切点表达式进行提取然后用PointCut注解方法进行单独声明再本类下面的程序中如果用到该切点表达式则直接使用注解后的方法即可如果在其他类中使用该声明过后的切点表达式则需要使用全路径限定名该方法即可本类使用注解后的切点表达式代码如下Slf4j Aspect Component public class AspectDemo { //定义切点(公共的切点表达式) Pointcut(execution(* com.example.demo.controller.*.*(..))) private void pt(){} //前置通知 Before(pt()) public void doBefore() { //...代码省略 } //后置通知 After(pt()) public void doAfter() { //...代码省略 } //返回后通知 AfterReturning(pt()) public void doAfterReturning() { //...代码省略 } //抛出异常后通知 AfterThrowing(pt()) public void doAfterThrowing() { //...代码省略 } //添加环绕通知 Around(pt()) public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { //...代码省略 } }在其他类中调用该切点表达式代码如下Slf4j Aspect Component public class AspectDemo2 { //前置通知 Before(com.example.demo.aspect.AspectDemo.pt()) public void doBefore() { log.info(执行 AspectDemo2 - Before 方法); } } 当切点定义使?private修饰时,仅能在当前切面类中使?,当其他切面类也要使?当前切点定义时,就需要把private改为public.引?方式为:全限定类名.方法名() ### 2.7 切面优先级Order 在切面类中会有多个切点同时匹配成功那么该如何进行执行顺序呢 应该使用注解Order数字来表示优先级顺序 Order注解标识的切面类,执行顺序如下: ? Before 通知数字越?先执行 ? After 通知数字越?先执行 Order 控制切面的优先级,先执行优先级较?的切面,再执行优先级较低的切面,最终执行目标方法.
写毕业论文必看:好用 AI 工具合集 以下是 2026 年最主流、适合毕业论文的 AI 写作工具,按全流程全能、中文专项、英文 / 润色、免费 / 轻量四大类整理,直接对应毕业论文从选题到定稿的全环节需求。一、全流程全能型(一站式搞定论文)适合:本科 / 硕博毕业… 2026/7/3 2:49:46
医疗AI场景下算法编程的深度解析(2026新生培训讲稿)(总结) 项目总结与完整Python程序 通过本书的学习,我们从医疗AI的基础知识出发,系统掌握了经典机器学习算法的原理与医疗应用,深入探讨了数据处理、特征工程、模型评估、可解释性、不平衡问题处理、模型融合等进阶技术,并在第16章中以ICU败血症早期预警系统为例,完整演示了从问题… 2026/7/4 8:05:07
PSO-SVM回归预测分析,多输入,单输出。 Matlab作图,预测电力负荷,数据来源于电工杯... PSO-SVM回归预测分析,多输入,单输出。 Matlab作图,预测电力负荷,数据来源于电工杯, 代码注释清晰,替换数据即可。 。电力负荷预测这玩意儿听起来就头疼对吧?数据波动大影响因素多,不… 2026/5/17 10:24:24
Host头碰撞漏洞:原理、自动化挖掘与纵深防御实战指南 1. 项目概述:当“身份”可以被伪造在渗透测试和资产发现领域,我们常常会遇到一种看似“死胡同”的情况:对一个IP地址发起请求,返回的是冷冰冰的403、404,或者一个毫无意义的默认页面。常规的端口扫描、目录爆破、指纹识… 2026/7/5 14:14:18
78_Python数据可视化matplotlib Python数据可视化:matplotlib从入门到美化 文章目录 Python数据可视化:matplotlib从入门到美化前言一、安装与基础架构二、折线图:趋势与变化三、柱状图:对比与排名四、饼图:占比与构成五、散点图:相关性与… 2026/7/5 14:14:18
密评与等保双合规!2026年企业如何一次投入两项达标 一道新考题:密评加等保双合规2026年,很多企业安全负责人突然发现自己面临一道新考题:以前只需要做等保测评,现在监管部门要求密评和等保两项都必须通过。这可不是简单的多做一套卷子,而是涉及技术架构改造、管理制度完… 2026/7/5 14:12:18
碳捕捉、利用与封存(CCUS):双碳目标下,高耗能产业脱碳的长期路径 在迈向碳中和的进程中,有一个现实不容回避:部分高耗能行业的碳排放难以通过电气化或可再生能源替代完全消除。钢铁高炉中的焦炭还原反应、水泥窑中碳酸盐的分解、化工厂的工艺过程排放——这些“过程排放”与能源消耗无关,而是化学反应本身的… 2026/7/5 14:08:17
时空视觉引擎赋能多源步态比对与人体行为深度分析白皮书 一体化步态预警研判系统|配套部署测评·四年运维全套服务 远距离无感步态生物识别·非接触式人员心理健康筛查平台 编制单位:镜像视界浙江科技有限公司 联合研发:镜像视界浙江普陀时空大数据应用技术联合研究院 课题资质:国家“十四五”时空大数据与视频孪生重点课题成果 权威认证:河南省电检院全工况精度检测、GB/T41773步态隐私合规认证、信创… 2026/7/5 14:08:17
TPS65263与STM32F107VC嵌入式电源管理方案详解 1. 为什么选择TPS65263与STM32F107VC组合在现代嵌入式系统设计中,电源管理方案的选择往往决定了整个系统的稳定性和能效表现。TPS65263作为TI(德州仪器)推出的三路同步降压转换器,与ST(意法半导体)的STM32F… 2026/7/5 14:08:17
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36