spring基础知识 (20):返回通知&异常通知&环绕通知

AspectJ 支持 5 种类型的通知注解:

  • @Before: 前置通知, 在方法执行之前执行
  • @After: 后置通知, 在方法执行之后执行,不管是否正常结束都会执行。
  • @AfterRunning: 返回通知, 在方法返回结果之后执行,正常结束才会执行。
  • @AfterThrowing: 异常通知, 在方法抛出异常之后
  • @Around: 环绕通知, 围绕着方法执行

返回通知

使用@AfterRunning注解, 方法正常执行完后调用,如果有异常,则不调用 可以访问到方法的返回值

异常通知

使用@AfterThrowing注解, 在方法抛出异常之后,并且和指定的异常相同或者是其父类可以执行。
如:入参为NullPointException ex,那么只有在发生空指针异常时才执行

 @AfterThrowing(value="execution(* com.spring.aop.*.*(..))",throwing="ex")
    public void afterThrowing(JoinPoint joinPoint,Exception ex){
        //方法名
        String methodName = joinPoint.getSignature().getName();
        System.out.println("method "+methodName+" occurs:"+ex);
    }

这里异常参数使用的是Exception 类型的,当发生Exception 或者其子类异常后都可以执行本方法。

环绕通知

  • 环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点.
  • 对于环绕通知来说, 连接点的参数类型必须是 ProceedingJoinPoint . 它是 JoinPoint 的子接口, 允许控制何时执行, 是否执行连接点.
  • 在环绕通知中需要明确调用 ProceedingJoinPoint 的 proceed() 方法来执行被代理的方法. 如果忘记这样做就会导致通知被执行了, 但目标方法没有被执行.
  • 注意: 环绕通知的方法需要返回目标方法执行之后的结果, 即调用 joinPoint.proceed(); 的返回值, 否则会出现空指针异常

看代码:

/**
     * 环绕通知需要携带ProceedingJoinPoint类型的参数
     * 环绕通知类似于动态代理的全过程: ProceedingJoinPoint这个类型的参数可以决定是否执行目标方法
     * 且环绕通知必须有返回值,返回值即为目标方法的返回值
     * @param pjd
     */
    @Around("execution(* com.spring.aop.*.*(..))")
    public Object around(ProceedingJoinPoint pjd){
        Object result = null;
        String methodName = pjd.getSignature().getName();

        try {
            //前置通知
            System.out.println("method:"+methodName+" begins with "+Arrays.asList(pjd.getArgs()));
            //执行目标方法
            result = pjd.proceed();
            //返回通知
            System.out.println("method:"+methodName+" end with "+result);
        } catch (Throwable e) {
            // 异常通知
            System.out.println("method:"+methodName+" occurs exception "+e);
        }
        //后置通知
        System.out.println("method ends");
        return result;
    }

环绕通知相当于配置了一个动态代理类,可以配置其他四种任意的通知方式。
不常用

猜你喜欢

转载自blog.csdn.net/abc997995674/article/details/80301461