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

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

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...
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容