aop拦截器链执行流程

cglib代理的对象执行流程

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

将上篇解析到的5个Advice封装成interceptor

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

org.springframework.aop.framework.ReflectiveMethodInvocation#proceed

 1.先执行系统的

 ExposeInvocationInterceptor

又回到执行链上了

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

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

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

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

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

after执行完后,还有finally逻辑

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

 这样整个逻辑执行完了。

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

先按chain的顺序执行链路,

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/u012222011/article/details/129994386