00:00
下边呢,我们来看一下,如果配置了多个拦截器,那么多个拦截器这个方法的执行顺序是什么样的,实际上啊,上节课我们对于这个。Employees这个路径就有两个拦截器,一个是first,一个是second,而且这个顺序呢,先first后second,执行顺序,对于prehanle按配置的顺序执行,对于posthan按置的反序执行,对于after comp按配置的反序执行,对吧?我们回想一下,讲Java web,讲Java web的时候,我们讲的那个叫过滤器,在趁点do filter方法的前后,是不是也是先正序,然后再反序啊?在学习R拦截器的时候,在那个evoer invo方法的前后,那个代码不也是先正序然后反序吗?
01:02
诶,道理都是相通的。来看一下这个图。更直观的呢,把这个顺序给我们说出来了是吧。First handle second handle个方法,然后注意second intercept的post handle。For post handle,然后执行渲染视图代码,然后secondletion,然后first intercept after completion,我们注意到,哎,这个屏幕左边的都是first,屏幕右边都是second,刚好是这样的一个对应关系。下面呢,从代码的角度再说一下。我们直接找到fourth intercept这三个方法加上断点。
02:07
Debug server。刷新早。首先停的是这个pre handle pre handle方法好了,我们看dispat do dispatch下一行,诶我们看这个顺序从零开始,一直到LIS小于LIS是吧?从按照我们那个配置的顺序去执行的,对吧。好了,看。Post handle往前一行,我们来看一下,来看一下,诶,从Les减一到零,这不就是倒叙吗?再来,我们看after completion。前边我们看这个顺序哦,这个顺序呢,并不是从那个length减一开始,不过我们知道也是从这一个大的数,然后完了往往零去执行,所以说也是一个倒序,对吧。
03:07
从代码这个角度呢,也解释了,不过这里边啊,我们需要来谈一下这个intercept index是什么意思。为了说他,我们带马先回来。先回来,先来问大家一个问题,如果我first intercept的这个pre handle方法返回值要是false的话,我来问大家这个时候这个代码如何执行?猜一猜。看一下。这个时候这个代码呢。只执行了一个pre handle看见了吧?哎,只执行了一个handle,没有执行目标方法。好的,我再问大家,如果first intercept这块要是返回一个。Or second intercept这个。
04:02
Pre handle方法返回一个false的话,这个时候这个代码怎么执行?早。先看效果。回退看。Prehan first secondhan,因为我执行了first prehan,然后呢,我要执行first after completion,这个时候这个顺序啊是。这样的。哎,这个时候呢,我们这个second in the handle方法返回了一个false,执行顺序是这样,中间的这些都变成虚线都不执行了。从源码的角度来说一下,这个时候就可以用到我们刚才说那个intercept index。好的,Debug,走起。点击过来。
05:00
哪哪看,晒晒哪。我们要看一下这个方法,这个时候的话呢,我们干脆在129行啊,我们加上一个断点。我们看。这个时候这个拦截器是什么呢。这个拦截器是first intercept,那这个时候这个呃,Intercept index这个值啊是零,我们干脆我们把这个先停一下啊,停一下我129行,我们加了个断点,这个时候我们再看效果。刚才那个看呀,可能不是很清楚。再来。点一下。好的好的,下一行我们注意这个interceptor呢,实际上最开始的时候啊,不是那个first interceptor,而是这个conversion service exposing intercept,好,我看一下它intercepts一共是四个,看到了吧,第一个呢是conversion service exposing intercept,好了,注意这个时候进来了,这个时候这个。
06:05
Intercept index这个默认值啊,是几啊,是负一,看见了吧,可不是零,可不是零,好了,然后往下走,OK,这个时候才把这个值置为了零,看到了吧,进来。好的。这是我的第。二个拦截器,就是这个first intercept。呃,它返回值是true,于是呢。代码往前来,往前来这块加上啊,于是呢,这个时候呢,这个cept t这个值被置为几啊被置为了。一好,然后我去执行。下一个拦截器,下一个拦截器应该是是谁了?Second in the,这个时候进来了,好了,于是这个值就被换为了一好的。
07:00
好的,然后我们走起,我们来看一下这个after completion的前一行,前一行这个值是一,从一到零,我可以执行两个拦截器吧,两个哪两个?哪两个?这两个,而这个执行不到,看见了吧,诶这是我们从代码的角度讲的这个原理。好吧,就是说我这个要是没有任何问题,执行完了,那我一定要执行释放资源的这个after completion方法。如果某一个拦截器的。Pre handle方法已经返回false了,我就不需要去释放资源了,听清了吧?OK。
我来说两句