【Spring源码】26.AOP之代理执行时切面的链式调用伪代码

2023-03-18  本文已影响0人  天还下着毛毛雨

用伪代码的形式看看,所有切面执行时的总体流程是咋样的。

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(){ //调回核心方法
                                                        // 所有切面执行完成。执行原生方法
                                                        method.invoke()();
                                                    }
                                                }catch(E x){
                                                    @AfterThrowing(e){};//出现异常
                                                }
                                            }
                                        }
                                        @AfterReturning(){};
                                    }
                                }
                            }finally{
                                @After(){};
                            }
                        }
                    }
                }
            }
            //@Around() dosomething end...
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读