[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);
    }

[补充]

  • 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);
    }

[注意]

  • 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();
    }

[注意]

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值