跳到主要内容

吃透Spring源码(二十):AOP拦截器链执行过程

文章目录

    • 例子准备
  • 一,执行流程
  • 二,获取拦截器链
  • 三,执行拦截器链
    • 1,ExposeInvocationInterceptor
    • 2,AspectJAfterThrowingAdvice
    • 3,AfterReturningAdviceInterceptor
    • 4,AspectJAfterAdvice
    • 5,AspectJAroundAdvice
    • 6,MethodBeforeAdviceInterceptor
    • 7,返回到AspectJAroundAdvice
    • 8,返回到AspectJAfterAdvice
    • 9,返回到AfterReturningAdviceInterceptor
    • 10,返回到AspectJAfterThrowingAdvice
    • 11,返回到ExposeInvocationInterceptor
  • 四,总结

例子准备

LogUtil.java

public class LogUtil {



private int start(JoinPoint joinPoint){


//获取方法签名
Signature signature = joinPoint.getSignature();
//获取参数信息
Object[] args = joinPoint.getArgs();
System.out.println("log---"+signature.getName()+"方法开始执行:参数是"+Arrays.asList(args));
return 100;
}

public static void stop(JoinPoint joinPoint,Object result){


Signature signature = joinPoint.getSignature();
System.out.println("log---"+signature.getName()+"方法执行结束,结果是:"+result);
}

public static void logException(JoinPoint joinPoint,Exception e){


Signature signature = joinPoint.getSignature();
System.out.println("log---"+signature.getName()+"方法抛出异常:"+e.getMessage());
}

public static void logFinally(JoinPoint joinPoint){


Signature signature = joinPoint.getSignature();
System.out.println("log---"+signature.getName()+"方法执行结束。。。。。over");

}

public Object around(ProceedingJoinPoint pjp) throws Throwable {


Signature signature = pjp.getSignature();
Object[] args = pjp.getArgs();
Object result = null;
try {


System.out.println("log---环绕通知start:"+signature.getName()+"方法开始执行,参数为:"+Arrays.asList(args));
result = pjp.proceed(args);
System.out.println("log---环绕通知stop"+signature.getName()+"方法执行结束");
} catch (Throwable throwable) {


System.out.println("log---环绕异常通知:"+signature.getName()+"出现异常");
throw throwable;
}finally {


System.out.println("log---环绕返回通知:"+signature.getName()+"方法返回结果是:"+result);
}
return result;
}
}