【Spring源码】26.AOP之代理执行时切面的链式调用伪代码
2023-03-18 本文已影响0人
天还下着毛毛雨
用伪代码的形式看看,所有切面执行时的总体流程是咋样的。
![](https://img.haomeiwen.com/i23353704/562dcf5aefb32e50.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(){ //调回核心方法
// 所有切面执行完成。执行原生方法
method.invoke()();
}
}catch(E x){
@AfterThrowing(e){};//出现异常
}
}
}
@AfterReturning(){};
}
}
}finally{
@After(){};
}
}
}
}
}
//@Around() dosomething end...
}
}
}