00:01
好,来大家听我讲,接下来呢,我们再来说一下拦截器中方法的执行顺序,刚刚我们研究过了是单个拦截器中方法的执行顺序,而现在我们要研究的是多个拦截器中方法的执行顺序,理解吧,哎,这个比较绕啊,来大家一起来跟我看好,那么现在的话,我们把这个服务器启动一下,好,我直接来把这个服务器启动一下啊,我就不debug了啊,我来启动一下。好,启动以后呢,我们就来访问一下,你看了哈,我还是通过我们刚才的这个请求走一下。怎么这么多个呀啊,这里面因为我这个请求是不是有一些其他处理啊啊,这不科学是吧,这太多了啊,哎呀,就不该偷这个懒是吧。
01:06
嗯,这样吧,不用他了,好吧,啊,一开始就不该偷偷这个懒是吧,写一个吧,好吧,写一个我们来单独来研究它。好,呃,那就试我们的啊,比如测试我们的这个拦截器啊,我们来写一个方法吧,好test incept啊啊,这是我们的啊,Cept啊,然后呢,这个方法的话呢,我们在后台呢,去给大家什么加上一个啊来加到我们这个里面,好加到这个位置好一开始我们就应该把它写出来是吧?OK,好迅手把它扎起来。好TCP,然后呢,这个上面呢,我们加上我们的request map,好叫做哎,好这里面的话呢,其实就没啥了啊,你就直接return success就行了,好吧,把它揉称一下,那么这就写好了啊,那切好以后呢,我们就拿它来进行测试啊好都关一下,然后呢,呃,现在的话呢,我们还是让它重新启动一下啊好看一下我们这个控制台,这个呢,已经给他什么启动了吧,好启动了以后呢,我们再来访问一下。
02:29
来,我重新打开我们的index页面啊。嗯。好来打开以后呢,我们再来访问它就行了啊,走一下,哎,这个就是正常现象了啊,刚才那个请求可能是里面啊有一些这个其他的操作了啊,那么我们就来看这个地方,那么现在我们要研究的是什么呀?是多个拦截器方法的执行顺序,那么大家来分析吧,看看这个结果是什么呀。
03:03
啊,这感觉上。又有正着走的,又有反着走的是吧?OK,那么其实这就是我们拦截器多个方法的执行顺序,那么我们来分析一下,对于我们现在的这个普handle这个方法来讲,它其实是根据什么呀,根据你拦截器的执行顺序来去执行的,对不对?因为我们现在配置的是不是先配置的这个first啊,对吧,后配置的这个second好,而对于这个post handle以及这个after completion来讲的,它是根据你什么呀,拦截器执行顺序的倒序来去执行的。对不对,OK,这是我们能从结果上面所看到的啊,能从这个输出语句上看到的这个结果啊,那么接下来我们要研究的问题就是为什么它会这么去执行,听懂了吧,来吧,那我们就要去,诶,结合上它这个底层的源代码来去给大家解析啊好啊,那我我还得重新第八个启动一下是吧。
04:16
好,来debug启动一下。好,启动以后呢,来注意了,我还是去访问它,走一下,OK,进入到我们的debug,那么首先呢,我们先执行到的是我们的普handle吧,对吧?那么现在的话,我们就要去进去研究它这个方法了啊,来进到这个方法里面,进来以后呢,大家注意,进来以后我们能看到它这个地方是怎么执行的呀,它会获取到所有的拦截器,判断一下等不等于空,如果不等于空,那么接下来的操作就是我去迭代你的每一个拦截器,然后呢,拿到每个拦截器去调用它的handle方法,看到没有。
05:02
看到了吧,来了,我们挨个把这个过程走一下啊,断点加到这,然后呢,让他先过来好来到这个位置,那么大家也要结合到这个位置来看啊,就是注意了,我先让这个代码呢,往下走一行,好我们能看到get in subject里面这个称呢,它里面给我称回来几个值呢?正回来总共有三个值,其中呢,就有两个是我们自己的拦截器,看到没有,第一个呢,是人家破MVC默认的一个拦截器,这个我们不做研究明白吧,那么大家要记住的就是什么呀,现在这个拦截器呢,总共有三个,而是放到了一个数组里面,然后呢,数组里面的第一个是人家的,第二个,第三个是我们自己写的,能看明白吧。能看懂吧,这个好,那么接在我们再来往后走,那么它再去执行的时候,它做了这样的一个循环,循环是从零开始,然后呢,诶往大了去循环的,对吧?那我们就来想哈,在这个拦截器数组里面呢,总共有三个啊,就是第二个就是这是我们的first,这是我们的second,这是人家什么MVC的,这个我们不管对吧?那我们就来想,我去迭代的时候,我从数组的零开始迭代,一直往大了迭代,那么我第一个拿出来的拦截器就是人家系统的吧,OK,第二个拿出来的是不是就是我们自己的了,那么先拿出来是个fo,再拿出来才是我们second吧,所以说诶,你能看到这个普handle方法的执行呢,就是根据你拦截器的这个顺序来去执行的,因为它是从小往大了迭代的。
06:37
能明白这个意思吧,啊,但是呢,这个位置我们还是要注意啊,有这么一个值是我们一会去用到的,叫做except index,给大家讲一下,这个值默认情况下啊,就是默认值它是一个负一啊,默认值是一个负一,那么我们再回来啊,大家来分析这个过程哈,只要我这个方法一调用啊,就拿到这个拦截器以后,这个if不满足的情况下,那么它这个是不是就会执行啊,因为if满足了以后是不是就return了呀,对不对?好,那么我们就来看哈,这个怎么就不满足了呢?是不是我们的拦截器去调用pro吧。
07:22
对不对?你看拿到每一个拦截去对象去调它的这个普handle方法吗?而这个普handle方法大家还记不记得它里面有一个返回值啊,我来给大家找到啊,你看这里面是不是有个返回值啊,普handle的我们现在主特的是不是都是true啊,对吧?好,来,那我们接着往后看,当我去调这个方法,如果你return的是一个true,那我再分一下是不是就false了,False以后这个if就不执行了吧,对不对?好,那因为我们现在的两个拦截器远程的都是true,也就意味着这两个if都不会执行,那么都会执行到下面这行代码,而下面这行代码我们来分析,第一次我的I是零,那么当它执行到这的时候,就把零是不是复制给他了,它就从负一是不是变成零了?第二次安是一,对不对,那我就什么呀,哎,把一呢又复制给这个了,那么它是不是从零变成一了,其实相当于这个。
08:22
这也是一个自动增加的一个过程吧,也就意味着你只要拦截梯的pre handle方法返回的是true,它是不是就会相应的往大了增加一啊,能分析出来这个过程吧?啊,那么现在我们总共有三个拦截器,三个拦截器都过了,也就意味着都返回的是处,这个值是几啊,二这个值是几啊,是不是二啊,对不对,因为我能取到012,是不是中共三个值啊,能能听懂了吧?好来这个我们先来给大家说一下,一会儿我们会用到啊好,那么对于这个普Han的研究我们就结束了,你已经能看出来了,从小到大来迭代的,那么执行顺序就是来根据你拦截器的执行顺序来的,好那么我们这个来大和return调用结束回去,回来以后的话呢?
09:16
这什么情况?怎么又又来了一次啊,这是。啊。是不是来的意思啊,有同学访问我的了吗?有吗?没有吧,不要访问我啊,访问我就出问题了,好吧,来吧,我看着这好像不对了,我来听一下啊,我重新来一下,要不一会讲了又出问题是吧?来,我们重新访问一下啊。好,来,我们重新来访问这个请求啊,Test的这个cept回去啊,我来访问一下,OK,先调用这个哦,Play handle,那么这个我们就不用再去研究了吧,对吧,刚刚已经看过了啊,好吧,来,这个我们就直接放行来,呃,这音又加过断点了哈,来,放行好,那么直些我们的my first啊,再走,好,接下来的话,你看一下是不是开始执行我们的谁了,请求处理方法的话,这个我们不研究啊,直接放行,那么接下来你看一下他是不是开始执行我们的post handle动了,OK,好,来,现在我们要进去,进来以后的话,大家注意它依旧是先达到所有的拦截器,看看等不等于空,如果等于空就匀称了,但现在等于空吗?不等于嘛,对吧,你看我加个断点啊,代码过来,过来以后呢,往下走,哎,你看是不是来到这儿了,对吧,那么我们也能看到这个get的IN3返回的值,是不是还是我们的三个拦截器啊,对不对,OK,那我们就来分析它是怎么执行的,它是。
10:52
到所有拦截器的长长度是几啊?三减一是不是二啊,好,I是从二开始的二,然后呢,往小了迭代吧,那我们就来想哈,对于我这个拦截器来讲,第二个取到的是谁呀?是不是它呀,对不对?好,那么先取到second,然后呢去调用post handle,再减减,再取到的是买first,再去调用post handle,所以说呢,我们看到的结果就是从后往前的吧,是不是OK,所以说为什么post handle是从后往前执行的,那就是因为人家在底层实现的时候,他在迭代的时候是一个从后往前迭代,明白这个原因了吧,OK,那这个我们也就研究明白了,好,研究明白以后我们来这个step正好,然后呢,断点再往后走,好,接下来的话。
11:52
那家看一下是不是开始处理我们的结果了,好,开始处理结果断点再走,那么就走到我们的trigger after comption,现在开始要去调用我们的after comption方法,好,我们也来点进来,点进来以后呢,大家注意在它里面呢,它也要判断等不等于空,那么很明显这个等于空吗?不等于,你看断点过来,好代码往下走一行有没有走它呀,没走,那么来到了这个位置,但是这个位置我们来看,它并没有去迭代你拦截器的什么呀,长度,而是通过一个except index,这个是我们在普handle中研究的吧,对不对,OK,好,这个值刚才是几来着?二好,那你就看吧,从二开始也是往小了迭代,那么对于我拦截器中的来,注意第一个是MVC的,第二个是我的first,第三个是我的second,那么来看。
12:52
二取到的是不是他呀,对吧,再减减一取到的是不就是呀,所以说你看一下我迭代的时候也是一个倒叙的,拿到每个拦截器去执行它的after completion方法,所以说对于after completion方法来讲,它也是一个倒序执行的,听明白了吗?啊,那么这样的话呢,我们就把这个拦截器方法的诶,多个拦截器方法的一个执行顺序也就研究完了,所以最终呢,大家只需要记住普瑞handle是从小往大了去迭代,因此看到的是一个正序的过程,好稍等一下啊。
13:42
来继续啊,OK,诶,我们这个迭代的时候,普handle呢,是从小往大了迭代的,因此我们看到的是一个正序执行的过程,而past handle以及我们的after completion,它迭代的时候是从大了往小了去迭代的,因此我们看到的是一个倒叙的一个过程。
14:12
明白了吗?所以说最终啊,我们就能看到什么了呢?来断点放心啊,我们就能看到,好,再来走一下就能看到什么了呢?执行顺序里面,先执行我们的first handle,在执行second handle,最后呢,在执行我们second的first handle first的post hand导哎,Second的after comp first的after comption,所以说这个多个拦截器的方法的执行顺序,现在能明白了吧,OK。
我来说两句