用伪代码的形式看看,所有切面执行时的总体流程是咋样的。
image.pngMethodInvocation.proceed(){
AspectJAroundAdvice.invoke(MethodInvocation mi){ // 取出调用链第一个AspectJAroundAdvice,调他的invoke方法
@Around(){ // 调Around
//@Around() dosomething start....
MethodInvocation.proceed(){ //调回核心方法
MethodBeforeAdviceInterceptor.invoke(MethodInvocation mi){ // 取出调用链第二个MethodBeforeAdviceInterceptor,调他的invoke方法
@Before(){}; // 先调用@Before(),再调回核心方法
MethodInvocation.proceed(){ //调回核心方法
AspectJAfterAdvice.invoke(MethodInvocation mi){ // 取出调用链第三个AspectJAfterAdvice,调他的invoke方法
try {
MethodInvocation.proceed(){ //调回核心方法
AfterReturningAdviceInterceptor.invoke(MethodInvocation mi){ // 取出调用链第四个AfterReturningAdviceInterceptor,调他的invoke方法
MethodInvocation.proceed(){ //调回核心方法
AspectJAfterThrowingAdvice.invoke(MethodInvocation mi){ // 取出调用链第五个AspectJAfterThrowingAdvice,调他的invoke方法
try{
MethodInvocation.proceed(){ //调回核心方法
// 所有切面执行完成。执行原生方法
method.invoke()();
}
}catch(E x){
@AfterThrowing(e){};//出现异常
}
}
}
@AfterReturning(){};
}
}
}finally{
@After(){};
}
}
}
}
}
//@Around() dosomething end...
}
}
}
网友评论