00:00
好,那我们刚才咱们交换了他们两个的顺序,那下面呢,我们在这咱们再来一个重新部署,然后咱们通过去观察这个源码呢,去验证一下他们执行的一个这个对吧,各个里面咱们的拦截器里面各个方法执行的一个顺序啊,为什么pre handle是按照顺序执行的,而post handle和咱们的这个after completion,然后是反序执行的啊。好,然后呢,我们现在呢,咱们把咱们之前,然后咱们跳过的这些断点,然后把它给取消掉,然后现在咱们通过浏览器,然后来发送一个请求,比如说我们现在咱们先来访问咱们的首页。但是大家注意咱们的首页啊,我们是没有去写一个控制器方法来处理的,我们用的一个叫什么叫做视图控制器。大家有印象吧,对不对,所以说这个请求是spring VC,然后通过咱们的视图控制器来进行处理的,对不对?所以说你看咱们刷新之后,然后大家看一下来,然后这一句话就是来执行咱们的拦截其中的pre handle方法的,然后咱们鼠标放上去,这个大家应该都认识,咱们刚才才看过叫啥呀,叫做handle the excution Cha,叫做处理器执行链,其中一共有三个内容,首先第一个内容是咱们的控处理器方法,然后第二个呢,然后其实就是咱们的控制器方法啊,然后第二个是拦截器集合,然后第三个呢,是咱们的拦截器索引,好,下面咱们把它给打开。
01:30
然后大家看,你看它匹配到的这个控制器方法是谁,对吧,然后在这呢,这个东西咱们没见过,因为这是咱们的视图控制器里面spring VC在解析这个视图控制器的时候,然后它自己创建的一个类,OK吧,它自己使用的一个类啊。好,下面呢,我们再来看,你看在这这个拦截器集合里边一共有几个拦截器。一共有四个拦截器,对吧,为什么呢,大家注意。我们之前咱们这个在上一次咱们去看的时候,这里面其实只有两个,因为我们当时咱们还没有创建second,对吧?我们能看到的就是这里面的这个conversion,然后service exposing interceptor,然后是这个和这个,而我们现在呢,然后咱们看到的一共有四个,大家注意这四个是从哪来的,首先呢,这三个大家应该都知道,这是我们springc自带的一个,然后这个是我们创建的,这个也是我们创建的,对吧?然后因为我们创建的顺序是先first然后再second的,所以说它俩的顺序没有问题,好,那为什么在这还有一个叫obstract URL,然后handler mapping对不对,这个东西是干嘛的,大家注意专门来处理我们当前咱们的视图控制器所对应的请求的,知道吧,所以说啊,这个东西大家一定要看好,它是干什么的啊,然后它是专门来处理我们的视图控制器所对应的请求的。
02:58
然后所以呢,大家可以不用管它,然后我们在这咱们直接F9F9F9跳过,然后跳过之后啊,然后我们现在咱们直接来访问谁,你看我测试拦截器,然后我们当前咱们的这个请求是不是就是我们自己写的控制器方法来处理的,对不对,所以说咱们点击之后大家再看啊。
03:20
这个时候大家看咱们还有几个拦截器,你看这后边的方法是不是咱们自己写的啊,然后咱们的拦截器集合里面一共有几个,一共有三个,这是不是咱们刚才看到的那个自带的,然后这是这两个是我们自己创建的啊好,那所以咱们就拿着我们当前的这个请求,然后来进行这个测试,OK吧,好,然后因为刚才那个里面,然后多出来了两多出来那个拦截器咱们也没见过是吧,那咱们就不管它了啊好,然后咱们直接拿着我们当前咱们的这个功能来测试,那首先咱们要进入到这个方法中,然后咱们来点击这个按钮,好进入之后呢,然后大家来看一下,你看这是哪一个类种,叫handle了excution change种对不对?那大家看,你看这个方法中它都干了点什么,它是不是来对我们当前咱们的这个类中的一个成员变量,叫做intercept list来进行了一个循环。
04:15
大家看,你看这是一个负循环,然后I等于零,然后A小于this的intercept list,然后点size。对吧,然后I加加对吧,然后再往下看,大家看啊,然后this.intercept list.get I这个I现在来表示的不就是咱们这个拦截器集合的索引吗。对吧,所以说咱们通过这一行是不是就可以来获取这个集合中的每一个拦截器了。对不对,然后呢,大家看咱们往下执行,大家看你看咱们第一个获取的是不是应该是咱们的spring VC里面自带的这个拦截器,对不对,然后来调用。这个拦截器的什么呀?Pre handle方法,然后呢,调用完pre handle方法之后,然后大家再来看,如果说handle返回的是true,那这个if是不是就不执行了,因为在这加的有叹号。
05:10
能看懂不?然后如果咱们在调用每个拦截器的过程中,如果它的pre handle方法返回的是false,大家注意这个if就要执行了啊。OK吧,好,然后咱们可以简单的先看一下,因为我们现在咱们的每个拦截器的pre handle返回的都是true,所以说咱们现在还不需要考虑这个force的问题。对吧,如果返回的是true的话,那咱们下面可以继续往下执行,如果返回的是false的话,咱们简单看一眼,大家看这个你认识不。啊,这个认识不认识,这个咱们之前在这里面说过呀,对吧,咱们在这还打的有断点呢,对不对,在哪呢,就在这个位置啊叫map的点trigger after completion。对吧,然后在这是不是调用的也是trigger after completion,因为是在同一个类中,对不对,所以说大家会发现,如果你当前你的pre handle返回了一个啥,返回的是false。
06:09
然后他并不会去执行咱们的after post handlera方法,但是它却会执行谁呀,叫做trigger after completion方法。对不对?好,这个咱们一会再说啊,然后在这再return一个force,那完了你看他return了一个force,那我们当前的这个方法是不是就return了false,然后它return了false之后,那大家再往上看,咱们回到我们刚才看到的这一行,对吧?然后看这如果它返回的是false,那大家说这个if条件是不是成立了,那后边是不是直接return下面代码,是不是就全部都不再执行了,对不对,对吧,为什么我们当前pre handle方法,你返回的是false的时候,咱们下面的代码,然后它都不执行。也就是说我们当前咱们的页面咱们都看不到,为什么?那是因为你返回了force之后,然后我们当前咱们的代码到这儿它就结束了,就不再往下执行了啊好,那我们现在咱们继续往下大家看好,那我们现在因为设置的都是出对吧,所以说咱们直接来看,大概的看一下这个过程啊,来执行,然后大家看你看他最后他又执行了一个一行代码,这行代码是干啥的,然后他把我们当前呢,然后咱们的这一个I的值赋值给了我们这里面的一个成员变量叫做intercept index。
07:33
叫做拦截器索引,然后这个拦截器索引因为咱们这一行代码还没有执行,所以说它最初的值是负一,然后我们在这把A的值,每当我们的一个过滤器的pre handle执行完,能执行到这儿,那说明pre handle当前的拦截器的pre handle返回的肯定是处,对不对,对吧?好,然后那我每当我们的拦截器的pre handle返回的是true的时候,我们是不是就会把这个拦截器的索引在集合中的索引,然后赋值给咱们的这个intercept index。
08:07
OK吧,但是大家一定要看好,如果你的哪个拦截器的pre handle返回的是false,那我们当前咱们的这个I还会复制给他吗?就不会了,那换句话来说,这个值大家听我跟大家说一句话,大家看对不对啊,这个拦截器,所以intercept index它来表示的是谁?它来表示的是我们当前pre handle方法返回false之前的这个拦截器的索引,大家说对不对?啊,大家想一下是不是。OK吧?没问题吧,大家想一下,因为如果我们当前你在这返回的是false的话,那它就不再往下执行了吗?那还会将咱们当前的索引复制给他吗?不会啊,当然呢,咱们现在呢,也是没有false的情况,那咱们就只考虑处的情况啊,好,然后我们现在咱们第一次循环之后,这个值是几啊,应该是零,大家看一下没问题吧,然后咱们第二次来执行,这个时候咱们获取的是不是应该是first intercept,然后我们设置的返回值还是处,那咱们再执行,这个时候这个intercept应该等于一。
09:16
大家看,然后再往下呢,是咱们的second intercept对不对,然后再往下来进行赋值,然后这个时候大家看一下它是不是应该来执行的,它是现在这个intercept index,现在就应该是几了,就应该是二了啊啊,然后点错了哈,好,然后那我们下面咱们再继续往下执行,大家看这个方法就执行完了,你看我们当前咱们pre handle,咱们的first intercept和咱们的second intercept,然后里面的pre handle就执行了,对不对?好,下面呢,我们接着往下,大家注意走到这儿,这个位置是干嘛的?调用咱们的拦截器方法,调用咱们的控制器方法的,好,然后咱们直接把它跳过,然后咱们跳到这儿,大家注意这是干啥的,来调用我们当前咱们的拦截器中的post的方,Post的handle动方法。
10:07
然后下面呢,咱们进入到这个方法中。好,然后咱们一眼就能看出来为什么它是一个反序执行,你看这是啥?A减减看到了没?然后咱们A的初始值是this.intercept list.size减一,然后呢,A大于等于零,然后I减减,然后来获取我们当前咱们的拦截器集合中的每一个拦截器,然后来调用拦截器的post handle方法能看懂吧?所以说为什么post handle是按反序执行的,咱们从源码里面就能看出来对不对?比如说这个时候咱们在这获取的这个拦截器,大家说应该是谁呀?是不是应该是咱们的second intercept呀,对不对,好,然后下面咱们来一个执行,大家看下面输出的是不是就是咱们的cept intercept的post handle,然后我们下面咱们再执行的话,那输出的应该就是first intercept的post handle来大家看没问题,然后咱们再执行一次,那这个输出的应该执行的就是谁啊,咱们当前咱们的SPAVC自带的这个拦截器的POS的handle头方法OK吧,行OK,那这个大家注意就执行完了,它也没有返回置,对不对,然后下面呢,我们来跳过F9跳到这儿,然后跳到这儿之后,我们是不是下面要跳到这个位置,是渲染视图,然后渲染完成之后,大家注意,咱们最终呢,就会来执行我们的after completion方法,好,那它为什么after completion方法,它为什么它也是反序的呢?然后现在咱们进入到这个方法中,大家看。
11:44
你这你知道了吧,为什么A减减吗。是不是A减减啊,好看这个方法叫trigger after completion啊,我们除了在咱们的dispatch of里面,在在我们渲染完视图之后看到的这个方法之外,我们是不是还在另外一个地方,咱们也看到过什么地方啊,大家有印象吗?
12:06
就是在我们当前咱们在执行pre handle方法的时候啊,对不对,大家再往上看看这儿啊,在我们去执行pre handle方法的时候,如果咱们的哪一个拦截器,然后它的pre handle方法返回的是false,大家说是不是也会去调用咱们的拦截器的after completion能看懂吧?好OK啊行,那咱们先把这个给看完,但是大家注意它在进行这个循环的时候,它的循环是跟谁有关系的,是跟我们当前咱们的intercept index有关系的。然后呢,也就是说它跟咱们当前的拦截器集合的长度,你有几个拦截器没有关系,它只跟我们当前的什么有关系,咱们说这个东西的这个东西,咱们可以怎么去形容它,怎么去描述它。这个intercept index,它表示的是谁?我们当前返回pre handle,返回false之前的这个拦截器的索引知道不好啊,行来下面呢,我们再往下看,那这个时候它应该是等于二,那所以说A减减,咱们通过这个索引,然后来获取咱们的每个拦截器,那既然它是从二开始的,那咱们获取的第一个,那肯定就是second呀,是不是,然后下面咱们来一个执行,大家看是不是second intercept after completion方法,然后再往下,咱们的第二个拦截器是不是应该是first intercept,对不对,大家看一下啊。
13:33
好,然后下面咱们再来执行,大家看输出的这个内容没问题吧,然后最后那应该是谁?应该是我们SPAVC自带的这个拦截器的after completion方法对不对?行好大家看,那我们现在就执行完了,咱们直接跳过就可以啊,好,然后这个就是我们通过咱们的源码呢,然后来验证我们当前多个拦截器中各个方法的一个执行顺序,然后咱们在这儿呢,给大家记录的有对吧?普瑞handle会按照配置的顺序来执行,而post handle和after completion会按照配置的反去执行,为啥?然后我就不去找源码把这些方法复制过来了啊,大家呢,这个直接自己去打个断点看看就行,OK吧,然后咱们从源码里面非常容易就能够看出来,你看这是A加加,所以说它是正确,然后呢,我们在咱们的post handle执行的时候,这是A减减,所以说是反序,然后最后一个是咱们的after completion方法的执行。
14:33
这也是A减减,所以也是反去OK吧,行好,那当然呢,这是我们拦截器它的pre handle返回的都是true的情况,那当然咱们在这呢也有返回false的情况,如果说我们的pre handle,然后返回的是false,那这个时候我们当前咱们的拦截器的各个方法到底是怎么来执行的呢?下面咱们就把这个问题呢,通过源码呢来给它演示一下啊。
我来说两句