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有一个拓扑排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值