00:02
职责链模式在spring mvc框架中应用的源码分析找了一下,在spring mvc框架里面呢?就是用到了在handlener execution change这里面呢,它就用到了职责链模式。那既然我们说到了spring mvc,我们首先给大家简单的回顾一下spring mvc的一个请求流程,这个呢对于学过spring mvc的同学来说还是比较简单的,我们我们还是看一下这个图。我待会呢,把最核心的地方点出来,大家可以可以看到它第一步呢,当一个请求来了过后,就先交给我们的dispatch,也就是说这个地方呢,会进行一个处理。他会干什么呢?OK,第一步他会做这个工作,做这个工作好,大家可以看到,在第二步的时候呢,他会找到对应的handler mapping,并且得到handler exe execution称。对,那么这个里面呢,包含了拦截器,注意看黄色部分,当他拿到以后呢,他从这个handler execution Cha里面拿到这个拦截器过后,他首先调用了拦截器里面的hand这个方法。
01:15
OK啊,然后这边做完了以后呢,它后面还会有一个调用handler intercept,也就是说我们这个拦截器的post handle方法,那同学们要注意调怎么怎么去调用的,待会我们注意源码,大家有发现它在这个过程中还会调handler intercept,就是这个拦截器的after complication这个方法,待会呢,我们要从源码里面找到这三个黄色的位置。因为这个地方呢,我们从代码里面,我们可以分析出来,从这个流程图可以分析出来。在进行一个请求处理的时候,首先我们的spring mvc他在dispat service里面先拿到了一个所谓的handler execution券,然后通过这这个对象呢来得到我们这个拦截器,并进一步调用拦截器的第一个方法,这个pre handle方法、post handle方法和after complic方法,我们现在来追一下它是怎么实现。
02:18
这个流程的。因为这地方肯定就是,也就是说它实际上是这个拦截器来完成这样一个职责链的,那么我们现在呢,来走一下这个代码,我们。在里面我们新建一个类,好吧,我们就叫re responsibility t什么呀。然后呢,我把主方法勾上,我们就从这个核心的方法里面往往里面追,从哪里面追呢?各位同学,咱们就从这个dispatch service往里面追,就根据刚才我们看到的流程来追好,我这边一边讲一边说做说明。好,第一步我们先来看dispatch service里面的一个核心方法,哪一个方法呢?只要学过MVC的同学就知道,里面有个最为核心的方法叫do。
03:09
找一下啊。A do dispat,大家可以看到在这个类里边,如果流行的同学可以看到,这里面呢,会有一个handleq execution Cha。是不是,那我就把我我把最重要的部分拿到这边来,好不好,最重要的部分拿到这来。OK,在这个,嗯,这样子哈。样子。好,这样子我就好讲了,嗯,这样子就好讲了。那么我们可以看到在这里边儿呢,我们。抓最重要的哈,这个先不要不要不要这些了,我们抓最重要的。诶,这个地方为什么呀。好,这样子就可以了。嗯。为什么会报错呀?
04:04
这个地方为什么会报错,看一下。好,重新来写一下。好,我把我把刚才那个代码拿过来一下哈,因为待会儿呢,我要把一些核心的部分拿过来给他看。这一部分。然后呢,我们往下走,其中它这里面有一个好,同学们可以看到它这里面有一个这个东西。我们一步步追,好吧,这个同学们看到这个呢,是什么玩意儿,通过这个分析,这个地方就是我们,嗯,当然下面还有一步去获取我们handler execution Cha,这个对象在哪里拿到的呢?来,我们看核心的代码,我只看核心代码,同学们在这。在。下面找吧,不着急哈。在这地方我们找一下是从哪拿到这个my handler的,往下追。
05:01
爱在这里。在这里,也就是说,嗯,他在这里呢,拿到了这个my handler方法,也就是说我们可以在这获取到了,获取到了这个handler execution handle change对象。好,拿到这个对象以后呢,我们继续往下面追踪,好同学们可以看到,我们就找了一个核心代码往下走。挖走。好,同学们可以看到在这里有这个方法,在下面呢,有这么一句,有这么一段代码,我们来分析一下,它在这里调用了my handler apply pre handler,那么我们有必要去看一下这个方法到底做了什么事情。也就是说他调用了我们。哪个呢?Handle execution Cha里面的apply pre,我们把这个方法追出来看一下。来,追进去。好的,当我们追到这儿来之后呢,我们发现其实这个地方就是。
06:02
我们handle execution training方法,但是我们仔细发现,我们发现他在这里面做了一件事情,干什么,他拿到了这个拦截器。看到没有,他在这拿到一个拦截器,然后调用拦截器的什么方法呢?Pre,看到没有,调用了拦截器里面的pre handle方法就这么来的。是不是就跟我们刚才这个图对应上了,他先拿到这个内部,因为这个内部里面包含拦截器嘛,拿到拦截器过后呢,它调用拦截器的play方法,就是我们所说的这个地方,好,所以说我把这种代码拿过来看一下。好,我嗯,这个地方我们就写到这儿就行了啊,我们这样做一个注释。我们这样做一个注释就可以了,说。在什么呢?在这一个MY的apply play这个方法内部,内部调用得到了什么呢?得到了得到了这一个我们刚才看的这个东西。
07:01
OK啊,就是拿到了它。拿到了它,拿到它以后呢,OK,然后再调用,调用了拦截器。拦截器的哪个方法呢?OK,就是同学们刚才看到这个方法。A,就是这个方法,我写到这里啊。把最关键的写出来就可以了。那么接着我们再来再来分析,他不是说还调用了这个post hand的方法吗?我们接着往下看在哪里调用的,接着往下看代码。还继续回到我们dispature里面的dopa往下走,诶,我们发现如果整个这个成功了,它就return了。如果没有成功呢,大家可以看到他在下面呢,继续调用了MY的apply post方法。大家有没有发现,是不是在这它下面还有一句这样的这样的代码。那么我们可以看到,在这个位置,我们同样要追到my handle里面的apply post handle方法,我们来看一下这里面会有什么东西呢?
08:03
往下追。好,我们一直我们发现很有意思,他在这儿呢,同样哈,又拿到一个拦截器。看到没有拿到一个拦截,并且调用这个拦截器的post焊的方法,也就是说他在这个里面呢,又做了一个工作来看一下。我们把这个往这写。做一个说明。说明。好,说明干什么呢,在这个方法中。在map map的handle这个方法中,方法内部获取,获取到拦截器。拦截器并并调用,调用什么方法呢?好,调用拦截器的这个方法调用。调用拦截器的。拦截器,诶拦截器的哪个方法呢?我们推过来哈,从里面粘过来,因为实在是太长了,这玩意儿啊OK。
09:03
是不是我们找到了呀,换言之就是我们拿到这个handler exe execution Cha,这这个Cha呢,然后在里面它包裹了,呃,里面包含着含有这个handle,然后再用handle的方法来进行一步一步的处理,如果说如果说这个成功了,返回没有成功,我继续调用handle的下一个方法处理,还有一个方法我们还要找一下在哪里呢?在这里是不是还有一个after complete comp completion after completion这个方法在哪调呢?我给大家看一下啊,在这个位置。其实他是在前面。大家可以看到在apply pre handle里面有个trigger after completion,我们找到这个代码追进去啊,这个方法其实就在这。就在这个地方,好,大家有发现在这里面是不是他又也去拿到了我们的拦截器,但这个拦截器是第几个。根据实际情况来取,因为拦截器它有很多学过MVC都就知道,拦截器呢,并不是一个他拿到这个是这个拦截器过后呢,他在这个拦截调用一个方法是不是,所以说这个trigger这个方法里面还调用了我们拦截器,那我就写到这了。
10:14
我们再补一句话。好,我们在这再说明一下,说明。在哪里呢?在。在我们的在这个方法里,内部。Map调apply这个方法内部内部中。内部中好还调用了,还调用。调用了哪个呢?还调用了这个方法。Trigger after a就调用这个方法。对这个方法内部该方法中,该方法中还调用了什么呢?OK,我就一句话了,好吧,在这里面呢,他做了这样一个处理。好,同学们大致应该明白这个流程了,那回到这个,这个图就一目而了然,其实他就是拿到一个handle这个券,然后呢,获取到内部拦截器,然后根据实际情况调用它不同方法来处理,实际上就是个链状啊,实际上这个链你看这个名字取的也非常到位啊,就是执行链。
11:18
职责链,那根据不同的情况,我就调用不同的方法,不同的方法调用它内部含有的拦截器的不同的方法来进行处理。好,同学们,嗯,根据这个我相信大部分同学都应该大致明白是什么意思了,对吧?因为代码也就说到这了,我们可以再做一点简简简短的说明啊,简短看看有没有必要做啊,因为这其实已经说的比较清晰了。说得比较清晰了。嗯,好,我我这里简单把他的思路再捋一捋吧,再捋一捋,好我在这里呢,再做一个代码的说明。再做一个代码说明。好,我把这个都不要了哈。大家看我对刚才讲的这一部分的内容再做一个说明啊,来走一个。
12:07
整理一下,说明一下。我们说明第一个呢,同学们可以看到就是spring,同时也可以看到spring mvc啊spring MC请求的流程图中,流程图中他干什么呢?他就执行了。执行了这个拦截器的相关方法,拦截拦截器相关方法。相关方法,哪些方法呢?就是我们所说的这个。Intercept点什么呀,就是我们说的。Pre。等等,好,我就不写那么多了,第二个我们可以看到是什么呢?在处理对,在处理什么呢?Spring mvc请求时。MVCMVC请求时怎么样?
13:05
是不是在这里面,它不但使用到了我们刚才所说的直质链模式,其实还用到了我们前面讲的适配器模式,其实也说过了,在这个过程中使用到使用到了。使用到职责链,职责链模式还使用到什么呢?还使用到前面讲的适配器模式。其实这个在前面我们提过,那换言之就是说在我们框架或项目里面,我们完成一个功能模块,可能是多个模式一起使用的,这点大家要注意分析,那第三点呢,我们可以看到汉德。就是什么呢,Hand。Handle什么呢,I?Cution就说execution,然后。他干什么呢?他主要负责。诶,我们写到这,他主要负责的是请求拦截器。
14:05
请求拦截,拦截器干什么呀的执行和什么呢?请求处理,他主要做这个事情,但是呢,注意听,但是它本身啊,它本身。它本身。不处理请求,他本身是不处理,不处本身不处理这个请求的,而是什么呢?只是注意听,只是将请求,将请求分配给什么呀,链上就是他这个链上注册的。多听这个有有需要有一点是不是MVC的基础啊,是分配给链上注册的处理器。处理器请求就是刚才我们所说的拦截器那些东西,对吧,处理器请求处理器这个执行。好了,这是一种什么呢?这是实际上是,这是什么呀?这是责任链或叫职责链。
15:05
职责链的实现方式就是直接链实现方式呢,跟我们前面有微有区别,微有区别,但总体来说还是一个职责链的形式,它减少了什么呢?注星它减少了职责链。职责链什么呀?职责链本身本身与处理什么呢?处理逻辑这地方很重要,处理逻辑之间的之间的一个耦合。哎,处理之间的有关规范了什么呢?规范了请求,规范了处理请求,规规范了一个什么呀,处理流程,这是核心点。如果你把这一块看出来了,那么非常到位,还有一个呢,同学们,我们刚才可以看到handler execution Cha呢,它其实维护了对不对,他从刚才我们分析可以看到它维护了一个什么呢?维护了我们这个。
16:01
就是刚才讲的handler这个intercept。就是那个拦截器inter set这个单词应该怎么写啊,Intercept,但是太长了啊,就是的集合,大家是不是发现它是一个集合呀。就是说他每次在取的时候,它是要便利的找到他需要的这个拦截,拦截器是不是,然后可以干什么呢?他可以注意推,可以向其中其中注册,注册相应的。对相应的什么呢,拦截器。难起。OK,讲到这就可以了,那呃,我们刚才源码也分析了,说明也分析了,相信大家对这个呢,应该有一个更加深入的认识,还是那句话,可能需要就是如果你提的有点模模糊糊的话呢,你可能只能感受一下这个代码了。你只能感受一下,因为这里面涉及到一一.spring mvc的知识,你学过spring mvc,那你知道老师在说什么,你要没有学过,你可能连这个图一上来就就干懵了,对,你看这边我们刚才讲的他有。
17:12
直着链模式,其实他这还有一个适配镜模式呢。好的,那关于源码的分析呢,老师就给大家,就给大家聊到这里好吧,就给大家聊到这里OK。
我来说两句