用偽代碼的形式看看,所有切面執(zhí)行時的總體流程是咋樣的。

image.png
MethodInvocation.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(){ //調回核心方法
// 所有切面執(zhí)行完成。執(zhí)行原生方法
method.invoke()();
}
}catch(E x){
@AfterThrowing(e){};//出現異常
}
}
}
@AfterReturning(){};
}
}
}finally{
@After(){};
}
}
}
}
}
//@Around() dosomething end...
}
}
}