spring学习笔记(17)——返回通知&异常通知&环绕通知

来源:互联网 发布:我的网络ip地址 编辑:程序博客网 时间:2024/06/03 19:41

本人接上篇spring学习笔记(16)——AOP之前后置通知

返回通知

    /**     * 返回通知: 方法正常执行完后调用,如果有异常,则不调用     *             可以访问到方法的返回值     * @param joinPoint     * @param result   方法的返回值     */    @AfterReturning(value="execution(* com.zj.asceptj.*.*(..))",returning="result")    public void afterReturning(JoinPoint joinPoint,Object result){        //方法名        String methodName = joinPoint.getSignature().getName();        System.out.println("method "+methodName+" end:"+result);    }

异常通知

    /**     * 异常通知: 当方法出现异常时     *            可以指定出现哪些异常时才执行: 如何指定?通过入参指定,如:     *           如果入参为NullPointException ex,那么只有在发生空指针异常时才执行      * @param joinPoint     * @param ex     */    @AfterThrowing(value="execution(* com.zj.asceptj.*.*(..))",throwing="ex")    public void afterThrowing(JoinPoint joinPoint,Exception ex){        //方法名        String methodName = joinPoint.getSignature().getName();        System.out.println("method "+methodName+" occurs:"+ex);    }

环绕通知

  • 环绕通知类似于动态代理的全过程,可以使用环绕通知实现前置通知,后置通知,返回通知,异常通知的功能,十分强大,但并不常用
  • 关于动态代理,请查看spring学习笔记(15)——AOP基础
    /**     * 环绕通知需要携带ProceedingJoinPoint类型的参数     * 环绕通知类似于动态代理的全过程: ProceedingJoinPoint这个类型的参数可以决定是否执行目标方法     * 且环绕通知必须有返回值,返回值即为目标方法的返回值     * @param pjd     */    @Around("execution(* com.zj.asceptj.*.*(..))")    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;    }
0 0