00:01
看一下。这个我们刚才讲了China handler对吧,我们再来看一下pipeline和China pipeline。那首先呢,我们说一下pipeline,还是就这个China pipeline啊,它是一个重点,China pipeline呢是handle的一个集合,我们先把这个说说完,我们再去给大家debug一下,它是handler的一个集合,它负责处理和拦截inbound或者是autobound的事件和操作,相当于是贯穿ni的一个链,你也可以这样理解,China piline呢,是保存了China handler的一个list。那简单这样理解啊,待会我们第bug你会看的更清晰,用于处理和拦截China的入站事件和出站事件,那China派那呢,它实现了一种高级形式的拦截过滤器,使用户可以完全控制试验的处理方式,以及China中各个China handler如何相互交互。但是这样我这样讲了过,大家基本上不知道老师在说什么,没有关系,下面呢,我们看一张图。
01:04
看这张图。这张图呢,是let中每一个China啊,都有,有且仅有一个China paper,那与之对应它的组成关系是这样的,大家可以这样认为哈,就是这,这是一个China。啊,这个China里面呢,有一个China PE OK,当然你你要说这个China PE里面包含它,其实这个,呃,因为他们相互都是可以互相获取到的啊,你也可以获取到我,我也可以获取到你啊,所以说你可以认为China和China plan呢,就这么一个关系,如果从这个图来说呢,可以理解成是China。而China里面它有一个China PE。对,那么嗯,大家看我,我在这个图上呢,画的比较清晰,有有这么一个关系,大家看这是一个双向的,这这边有个方向,这边还有一个方向,对吧,所以说我们可以这里面一个China,包含了一个China pipeline。明白。而一个China PE呢,又维护了由China context组成的一个双向链表。
02:05
也就是说我们整个China PI line呢,它实际上是由多个China handler contact组成的,而且是个双向链表。对,并且呢,每一个China handle contacts又关联了一个处理事情的China handler。好,这样子理解起来可能是呃,非常的麻烦了,现在呢,老师刚好我们不是刚好讲了一个这个案例吗?而且这个里面是不是我加了两个handler,刚好用这个来做演示,好,我们来跑一跑。现在呢,我们在。在这个地方来做处理,这边是不是我们加了一个,呃。Htp server,呃,口袋它是一个,它实上是handler,这又是个handler,那现在呢,我们在这说了一句话啊,比如说我们这写个OK。OK,我把断点下到这儿。下到这过后呢,待会我们debug,我们来看一下到底这个拍烂里面有什么玩意儿,这样就一目了然了。
03:06
对,必须通过这个代码的追啊,追这个代码,你才能把这个讲清楚,不然的话,老师实际上是很难说清楚的,来走一个。跑起来。好的,跑起来过后呢,现在呢,我们。刷下。刷以后代码就执行到这里了,来快速的走一走,我们看一下拍烂是什么东西。首先看这这个拍PE呢,是一个,呃,是一个包含很多属性的对象,对吧,那首先我们看它有hide和TT,这是不是对应刚才我们看的这个图啊,我们刚才说是看到一个图,它有一个head。对,然后head呢,往下走有很加了很多的这个contact,就是handle contact,最后呢有个T。是不是这样就看出来了吧,那那大家看到其其实啊,其实刚才老师不是说了一句话吗?诶等一下。
04:04
交出来。你看拍烂里面其实也可以拿到它对应的channel,所以说你说谁包含谁也不是那么好说的,对吧,因为我也可以包含我也我也可以找到你嘛,说这这个关系大家明白就行了,所以它是个双向的,我们进去看啊,从头开始往下追。看第一个head head下面看有个next pre没有吧,因为它是双向链表,双向链表呢,它因为它第一个就我们刚刚进来的看到是第第一个,第一个呢,他前面就没有,他下一个是谁呢?大家看。同学们看第一个放的就是谁呀,往下走。看。同学们看他,呃,他放的第一个handler就是我们test service initialize。对吧。也就是说,呃,我们整个这个server呢,它也是一个handler。只是大家有没有发现这个light的类型,就这个light类型其实是一个deat China handle context,这就证明了刚才我们所说的,在整个双向列表里面,它真正的类型放的是一个handler contact,而不是直接放的handler。
05:13
明白了吗?哦,OK,所以说他现在第一个呢,我们认为放在我们,我们能够识别出来的就是这个test service啊,In initial,待会我给大家追一下,就是我们的这个,呃,China initialize本身它也是一个handler。往下继续走,往下走,下一个,下一个是不是就到了我们增加的htp server口袋。是不是下一个就他,而且呢,下一个下一个咱们放的呢,也是呃就是下一个我们放的是呃就是这个deat China handle cont,又是它吧,它在这里面又包含了我们这个h DB server口袋,再下一个看又是那下一个又是det China handle里面又包了一个什么,就是我们test server。
06:05
又找到了。好,那下面还有吗?还有最后一个结尾的,最后一个结尾的是一个deat,看到没有,默认的deat China pipeline。啊拍,那这个地方其实就再往下面就没有了,其实下面这个啊,同学们next下面这个就已经是个t context了,在这里面其实就已经没有包含handle了,没有吧,在下一个就空了,已经不能再往下面走了。是吧,所以你看这条线下来是不是很清晰,第一个他这是我们的这个哦,我们能识别的它第一个第二个是吧,第三个。下面没有了,已经找不到我们的,你再往下面走,Handle这边这个next已经不包含这个handle了,看,没有了。是不是也也也就到结尾了,所以说整个这个流程大家就看的很清晰了,反过来我们再看一下,从尾部再追一下。从尾部追,如果从尾部追的话呢,同学们可以看到它前面从尾部追它的next已经空了没有了,所以说它前面pre呢,第一个就是第也是一个contact里面放的是什么handle呢?是这个是不是我们自定义的那个handleler。
07:14
再往前面追,是不是就是我们那个口袋htb server口袋也是放在一个content里面的,再往这个前面追。再往前面这这个handle,就是我们这个test serve server initial,这也是handler说这个前后方向呢,就定下来了。爱就定下来了,好。好,通过刚才这个锥啊,通过刚才这个锥,大家应该是对这个图就有个理解了,对不对,就现在再来看这个图,是不是看起来就哦比较清晰了,看啊我们可以认为。China里面有China PE,当然你要反过来认为也是可以的,然后这边呢,对不对,有个头,这个头呢,放的是这个头,这个head类型呢,其实是一个China handle contact,但实际上真实的类型啊,因为China handle contact它是个接口,说真实的类型并不是它真实的类型是哪一个呢?就是真正这个我们所说的China handle contact,它真实的类型其实是这个类型。
08:14
待会儿我也给他追一下。就是,呃,同学们看到这个玩意儿,嗯,我在这看这个。就是我们所说的这个类型。其实它真正的类型呢,嗯,这是个接口,肯定不可能是真实类型,不是它,而是哪一个呢?而是这个default China contact,是不是刚才我们已经看到这个东西了。对吧,所以待会你要有兴趣,你可以在这说出一句话,你来看一下我们这边拿到的这个ctx啊,其他真实的是default handle context是这个东西,好接着再回来再看再看,呃,那么呃这边呢,就是每一个就是每一个这个呃,China context的呢,就是他自己呢,也也有一个next和他自己也有一个就是往下指的,对吧,刚才不是看到了吗?进去过后有个next和pre啊,这样就不停的把这个连起来了啊连起来了就这边呢,又往下面走走走,那么这边是head,这边是尾,那在加入的时候,它是按什么顺序加进去的呢?
09:17
对呃,那你如果是双向链表,大家对这个链表应该有一点熟悉,对不对,就是如果我往尾面尾部加,我再加一个尾部,它就在后面了,所以说为为什么同学们看到,为什么我们在这个地方。看到的第一个hi,就是我们hi的第一个这个handler,其实是这这哪个呢?是这这个是这个past server initialize,因为它本身也是一个handler。同学们可以看一下代码。看它的类China,呃,Initialize,其实它也继承了China in board adapt,你再往里面追,是不是,是不是也到这来了,再往里面追,是不是它也是个China handle呀,所以说我们第一个,呃,就是整个这个pipeline里面的。
10:08
拍拍line里面的第一个handle,其实就就这个实例,然后再加的是哪一呢?是htp server口袋,然后再是哪一个呢,才是我们自己的HTTP,呃,就是test htp server handle,它是这样子来的,所以它的顺序,呃,如果根据我们这个来看的话呢,其实就是这样子一个关系啊。那么我们接着再看下句话,入站事件和出站事件,针对这个图我们就看的比较清晰了,他说的入站事件呢,它是从链表的头往后传递。OK,就这样子好,这个呢,我们就称之为是一个入战事件,对最后传递到最后一个入战的handle德尔,那出战顺序呢,它是从T,它从尾部往这边传,这是它定义好的。对对,所以说你在这个处理的时候呢,你看你整个这个事件的流动是怎么回事,那一般会怎么去认为呢?一般是这样认为的,就是说这个头这边呢是我们的server,而这边呢,是我们的什么呀?是我们的client,因此为什么说当事件是从客户端往服务器这边走的话呢,我们认为是一个什么呀?是一个出站,因为这边它从尾部往这边走的吗?尾部往前传递,前一个叫出,这个叫出站啊这么去理解,而且两种类型的handle德尔呢,他是相互不影响的啊,当然你你这有没有,你就说你这边有没有设计这个出站,那那你自己要去看清楚了,对吧,你自有没有设计这个出站,你要看清楚了,好的,出站的时候,他是走的是哪个走的,是我们这个出站,这条线入站走的是入站这条线,好的,那关于嗯,PI PI nine,还有这个China PI nine,我们就说到这,最后再证明一点,再证明最后一点就是我们这个类型。
11:55
不是刚才老师说了吗,这个类型它真实的类,真实的数据类型是这个。
12:01
啊报我们简单给大家,给大家输出一下就可以了。Ctx的类型,它真实的类型等于加想。对,CX。点get class好,我们。把这个debug停掉,我们运行一下看一下。运行起来。运行起来。好的,运行起来功能同样我们用浏览器请求一下就可以了,请求这边我们再看,诶同学们看到的的确确类型是default China handle contact对吧,所以这个关系大家一定要搞清楚啊,就说呃,别人面试官问你的时候,你你不要说,你千万不要说,诶我们这帮直接整个这个整个这个就就跟这个contact没有关系,其实是整个靠它连起来的,它里面包含了handle,说这样子理解看到没有,诶就是维护了一个China handle contact的组成的列表,每个China包关联着一个China,好了,那这话就不多说了,我们就说到这里。
13:07
那最后呢,还有一个常用方法再来聊一下,一个是at first,一个是at last,简单说一下,At first就是把业务处理类,就handler添加到列表中第一个位置啊,如果是at last呢,它是把它加入到我们最后一个位置。对吧,这个名字都已经说的很清晰了,好,同学们,那关于管道这块内容,我们就给大家聊到这里,大家有兴趣呢,自己再把这个源码再追一追,就看得更清晰了。
我来说两句