• [Spring笔记] Spring-35-AOP通知获取数据


    Spring-35-AOP通知获取数据

    1、获取参数

    对于 @Before, @After, @AfterReturning, @AfterThrowing 四种通知来说,在通知方法中加上一个类型为 JoinPoint 的参数,调用其中的 getArgs() 方法即可获取调用原始方法的参数,返回类型是 Object[] 数组

    对于 @Around 通知,有 ProceedingJoinPoint 作为参数,而 ProceedingJoinPoint 继承了 JoinPoint 接口,所以可以直接调用 getArgs() 方法获取参数

        // After, AfterReturning, AfterThrowing 用法与 Before 相同
        @Before("pt()")
        public void before(JoinPoint jp) {
            Object[] args = jp.getArgs();
            System.out.println("args: " + Arrays.toString(args));
        }
    
        @Around("pt()")
        public void around(ProceedingJoinPoint pjp)  throws Throwable {
            Object[] args = pjp.getArgs();
            System.out.println("args: " + Arrays.toString(args));
            
            pjp.proceed();
            // args[0] = -1;
            // pjp.proceed(args);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    [补充]

    • Around 通知中可以更改原始方法的参数值,将 args 作为参数调用 proceed() 方法,如上示例中注释部分

    2、获取返回值

    只有 Around 和 AfterReturning 两种通知能够获取返回值。

    After 通知虽然在切入点执行之后,但即使原始方法执行出错,未能正确返回,也依然会执行 After 通知,所以不能保证存在返回值

    Around 通知中,调用 proceed() 方法时用变量接收返回值即可

    AfterReturning 通知要在注解中加入 returning = ”ret“, 并在通知方法中将 ret 作为参数传入(ret 是参数名称,可以自行修改)

        @Around("pt()")
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            Object ret = pjp.proceed();
            System.out.println("returning = " + ret);
            return ret;
        }
    
        @AfterReturning(value = "pt()", returning = "ret")
        public void afterReturning(JoinPoint jp, Object ret) {
            System.out.println("returning: " + ret);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    [注意]

    • AfterReturning 通知方法中同时存在 JoinPoint 和返回值 ret 做参数时,要将 JoinPoint 放在前面,否则程序无法运行

    3、获取异常

    Around 和 AfterThrowing 两种通知能够获取原始方法抛出的异常。

    Around 通知中,调用 proceed() 方法时用 try/catch 语句包裹即可捕获原始方法异常

    AfterThrowing 通知获取异常的操作类似于 AfterReturning 通知获取返回值,在注解中加入 throwing = “throwing”,再将 throwing 作为参数传入通知方法

        @Around("pt()")
        public Object around(ProceedingJoinPoint pjp) {
            Object ret = null;
            try {
                ret = pjp.proceed();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            return ret;
        }
    
        @AfterThrowing(value = "pt()", throwing = "throwing")
        public void afterThrowing(JoinPoint jp, Throwable throwing) {
            throwing.printStackTrace();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    [注意]

    • 和 AfterReturning 通知方法一样,JoinPoint 作为参数要放在前面

    视频链接:https://www.bilibili.com/video/BV1Fi4y1S7ix?p=37

  • 相关阅读:
    玩转Vue3全家桶03丨新特性:初探Vue3新特性
    文件传输、文件挂载MOUNT:NFS、CIFS、ADB、SAMBA
    YOLOv8改进主干DAMOYOLO结构:最新改进提出 CReToNeXt 结构,基于阿里达摩院出品的DAMOYOLO核心网络模型进行改进,打造高性能检测器
    《JAVA设计模式系列》责任链模式
    在线订餐管理系统
    QT之可自由折叠和展开的布局
    C# 委托详解
    YII 优雅的实现软删
    MFC Windows 程序设计[122]之树形下拉列表框
    30-33、SpringBoot项目部署\属性配置方式\多环境开发(一个文件)\多环境分组(多个文件)
  • 原文地址:https://blog.csdn.net/Cey_Tao/article/details/126287316