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

Spring AOP

一·

AOP(面向切面编程)思想,简单理解为:把多个方法的重复逻辑(比如统计耗时、打印日志)抽离成“统一
逻辑”,一次性作用到目标方法上,不用逐个修改方法。
比如想知道业务层的所有方法耗时情况:

  • 连接点(JoinPoint):程序执行过程中可被AOP拦截的所有点(Spring AOP中仅指方法执行),即
    “所有能被 AOP 控制的方法”;
  • 切入点(Pointcut):连接点中“实际被选中的方法”(比如所有Service层方法),由@Pointcut+切
    点表达式定义;
  • 通知(Advice):需要对切入点方法执行的重复逻辑(比如统计耗时),体现为一个方法,
    @Around/@AfterThrowing 等注解指明“通知执行的时机”(环绕/异常后);
  • 切面(Aspect):描述“通知”和“切入点”的对应关系(比如“统计耗时的通知”作用于“所有
    Service 层方法”),用@Aspect标记切面类(需配合@Component 交给容器管理);
  • 目标对象(Target):切入点所指向的类的对象

AOP是通过动态代理技术实现的。首先为目标对象生成一个代理对象,如果目标对象实现了接口,则和目标对
象实现同一个接口,如果没有,则继承目标对象。然后再实现里面的方法,方法里面就是把通知里的逻辑和调
用的目标对象的切入点方法整合到一起。然后把代理对象交给Spring的IOC容器去处理。如果Controller中需要
注入时,注入的就是代理对象了

二·AOP 五大通知类型

  • 前置通知 @Before 切入点方法执行前 前置校验(如参数检查)、日志记录
  • 后置通知 @After 切入点方法执行后(无论是否异常) 资源释放、最终兜底操作
  • 返回通知 @AfterReturning 切入点方法正常返回后 处理返回结果(如数据加工)
  • 异常通知 @AfterThrowing 切入点方法抛出异常后 统一异常捕获、报错日志记录
  • 环绕通知 @Around 切入点方法执行前后(全程包裹) 耗时统计、权限控制(最灵活)
    补充
  • 环绕通知(@Around)需手动调用 joinPoint.proceed() 执行原方法,是唯一能控制原方法是否执行的通知;
  • 环绕通知方法的返回值必须指定为Object来接收原始方法的返回值
    日常开发中,@Around(耗时 / 日志)+ @AfterThrowing(异常)是最常用的组合

三·通知顺序

当有多个切面的切入点都匹配到了目标方法时,多个通知方法都会运行。运行顺序如下:

默认按照类名字母排序

目标方法前的通知方法:字母靠前的先执行
目标方法后的通知方法:字母考前的后执行

如果切面类用@Order()来控制了

数字小的先执行

四·切入点表达式

  1. 基于方法签名的 execution 表达式(最常用)
    核心格式:execution(返回值类型 包名.类名.方法名(参数类型))简化规则:
  • 表示 “任意”(任意返回值 / 类 / 方法);
    .. 表示 “任意参数 / 任意子包”;
    2.基于自定义注解标志的方法来找到切入点方法
    ① 自定义注解(如 @Log);
    ② 给目标方法加 @Log;
    ③ 切点表达式写 @annotation(com.xxx.annotation.Log);里面是自定义注解的全类名

五·连接点

spring中用JoinPoint抽象了连接点,可以用它获得方法执行时的相关信息,如目标类名,方法名,方法参数等。

目标对象 joinPoint.getTarget() 所有 JoinPoint com.xxx.service.UserServiceImpl@123456
目标对象类名 joinPoint.getTarget().getClass().getName() 所有 JoinPoint com.xxx.service.UserServiceImpl
执行的方法名 joinPoint.getSignature().getName() 所有 JoinPoint findUserById
方法全限定名 joinPoint.getSignature().toLongString() 所有 JoinPoint public com.xxx.entity.User com.xxx.service.UserServiceImpl.findUserById(Long)
方法参数数组 joinPoint.getArgs() 所有 JoinPoint [1001](参数为 Long 类型的 1001)
代理对象 joinPoint.getThis() 所有 JoinPoint

注意:

  • 对于@Around通知,获取连接点信息只能用 ProceedingJoinPoint
  • 对于其他四种,只能用 JoinPoint 他是ProceedingJoinPoint的父类
http://www.zskr.cn/news/111604.html

相关文章:

  • 【案例共创】从0开始使用华为云开发者空间搭建房价预测模型
  • JX6-CON1控制器模块
  • AIGC简介
  • LobeChat安全与权限管理实战解析
  • 女朋友到家前 10 分钟,空调自动开暖风(小智 MCP 实战)
  • 海报设计无从下手?这3个技巧让你告别空白画布
  • β-Amyloid (25-35);GSNKGAIIGLM
  • 【小白笔记】大数加法
  • 算法题 重构字符串
  • 无人机红外图像下极小目标检测数据集,无人机红外小目标检测数据集 低空安防、机场净空监测、反无人机系统、鸟类迁徙监控 YOLOv8** 构建的 **无人机红外图像下极小目标检测系统
  • 深入解析:电压基准芯片详解:从原理到选型,附 TLV431 应用解析
  • Docker安装轻量级TensorRT镜像用于边缘计算
  • 2025全球优选:手机切膜机模片供应商,定制生产,认证制造商,美特柏(Mietubl)全链实力解析
  • β-Amyloid (1-40), Rat;DAEFGHDSGFEVRHQKLVFFAEDVGSNKGAIIGLMVGGVV
  • 【第60套】题目质量很高!
  • 【必藏】AI大模型全景分析:程序员小白入门全指南,读这篇就够了
  • 【编号645】全国省市县行政区划矢量数据2025年更新
  • Arbess从基础到实践(19) - 集成GitLab+sourcefare实现Java项目代码扫描通过后自动化部署
  • Arbess从基础到实践(17) - 集成GitLab+SonarQube实现代码扫描完成后自动化部署
  • Arbess从基础到实践(18) - 集成GitPuk实现Java项目自动化构建并Docker部署
  • 记-一次较为离谱的病毒乌龙
  • 停止检索!新增4本On Hold期刊被踢,12月WOS期刊目录更新!
  • 12.10 标签(二)
  • 智慧校园建设三步走:选对平台是关键
  • 草莓病害智能识别与分类 - 基于YOLO11与多注意力网络的快速检测系统
  • 学习笔记——写时复制(Copy-on-Write)
  • ​ Android 基础入门教程​之​TableLayout(表格布局)
  • Git:分布式版本控制的哲学、理论与创新
  • Mockito实战指南
  • 2025年优测平台:微服务全链路性能瓶颈分析与最佳实践