• [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

  • 相关阅读:
    Day15用栈实现队列&用队列实现栈
    React <> </>的用法
    php 把数字转化为大写中文
    JavaSE:String类
    Maven进阶-属性与资源文件
    为什么短时傅里叶变换无法实现小波等优秀时频方法对时频分布的提取效果?
    接口幂等性
    IE浏览器设置兼容性、清除缓存,重置浏览器、Edge浏览器设置兼容性
    text2sql、nl2sql框架总结
    C++ Primer Plus第五版笔记(p101-150)
  • 原文地址:https://blog.csdn.net/Cey_Tao/article/details/126287316