aop拦截器链执行流程

cglib代理的对象执行流程

aop拦截器链执行流程_第1张图片

 org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept

将上篇解析到的5个Advice封装成interceptoraop拦截器链执行流程_第2张图片

 执行目标方法前会执行其他拦截器的逻辑,有几个advisor及执行几次

org.springframework.aop.framework.ReflectiveMethodInvocation#proceed

aop拦截器链执行流程_第3张图片

 1.先执行系统的

 ExposeInvocationInterceptor

aop拦截器链执行流程_第4张图片

又回到执行链上了

aop拦截器链执行流程_第5张图片

 

执行第二个执行链AspectJAfterThrowingAdvice,同样回到老地方

aop拦截器链执行流程_第6张图片

 执行第三个执行链AfterReturningAdviceInterceptor同样回到老地方,注意这里回到老地方还有剩余的逻辑没处理完,记住后续这里还要继续执行。

aop拦截器链执行流程_第7张图片

 执行第四个执行链AspectJAfterAdvice.java同样回到老地方

aop拦截器链执行流程_第8张图片

 

执行第5个执行链MethodBeforeAdviceInterceptor,会先执行业务逻辑,然后回到链路上

aop拦截器链执行流程_第9张图片

 所有链路上的拦截器执行完后,执行目标方法。

after执行完后,还有finally逻辑

aop拦截器链执行流程_第10张图片

执行完链路然后继续执行afterReturning的逻辑

 

aop拦截器链执行流程_第11张图片 这样整个逻辑执行完了。

总结:记住这5个执行链的顺序,实际打出来的结果和这个不一样,原因是链路执行顺序并不是业务执行的顺序, 

aop拦截器链执行流程_第12张图片

先按chain的顺序执行链路,

AspectJAfterThrowingAdvice.java要等目标方法执行完报错后才会去执行业务逻辑。

aop拦截器链执行流程_第13张图片

 

AspectJAfterAdvice.java等目标方法执行完后才会执行业务逻辑

aop拦截器链执行流程_第14张图片

 before是由业务逻辑的,执行完后才会去执行链路,也就是先于链路执行,

aop拦截器链执行流程_第15张图片

 等所有链路执行完了,执行目标方法,然后根据是否报错,报错执行报错逻辑,有返回值则执行返回值逻辑,顺便可以吧返回值带进业务逻辑,无论如何都是执行after逻辑,应为是finally包裹的。

关于aop执行顺序:一定是before先于after,其他after,aftergthrow,afterreturn根据解析到缓存的顺序,前面在链路上先执行,那么必然剩余的方法在后面执行。没有固定的顺序,底层解析advisor有一个拓扑排序。

你可能感兴趣的:(spring)