吃透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;
}
}