00:00
嗯,好的,那么反正这些方法啊,他肯定都会被毁掉啊,我们先直接就是现在呢,没有在看这个识别代码之前的话,我们,呃,就是我先直接说结果,基于我的理解来说一下这个最终打印的结果,然后再来通过源码去看一下是为什么,呃,我也看一下我有没有忘记,因为这里面确实有点复杂,那什么意思啊,比如说他他在打印的,他在后台打印的话,肯定就是我们直接看嘛了,他应该打印的就是这样子一个顺序对不对,你看这样这样这样这样这样子吧,我们先把这个给它关闭吧,我们直接来猜一下,或者按照我的理解来看一下,到底我理解的对不对吧,那么我们来猜测一下他的一个打印顺序,就是他们肯定会回调了这个地方,那么他们回调的顺序的话,他的是不源码是决定的的啊,而且你如果看懂这里的话,就方便你去做一些扩展,所以这个地方一定要懂啊,来我们来看一他的一个结果,我们来猜一下,也不能猜吧,就是凭我们的理解,或者凭我的理解我们来试一下,呃,因为我现在知道你们不知道,所以说你们这里面会看起来比较懵,但是没关系,你接着往下看,就是你最后看完这个课之后的话能够做。
01:01
说像我这样子去自己去猜,或者自己去看这个图,就能够看出来他们的执行顺序是最好的啊,比如说因为在spring当中,他最先执行的就是说他有一个大的前提,就是说我们所有的并factor possible, 这无论是直接实行子类还是实现负类的啊,那么spring首先它是执行的是子类的,也就是说肯定是先执行绿色的,那么绿色里面又根据来源不同斯,不论最先执行的是什么东家,程序员通过API注册的也是这个C,也就CC要是最最先执行的。啊,我再讲一遍来,首先是spring是会去找到你,你类似的一条,因为你所有的都在这里边,对不对,是spring是你不是在这个地方已经给了一个什么东西啊,给了一个呃并factory给他吗?来我们来看一下,来在传的时候,你不是传了一个并factory过去吗?把这个并factory传过去了,这个才传过去了,那么你又把这个list的传过去,这个list史就是我们通过呃API提供的对不对,那在这里你不是通过API前面提供了两个给他吗?这两个吗?所以说你通过API提供的这个呢,呃,他已经拿到的这个方法里面,然后的话呢,你这些ABCD你通过扫描的也好,通过动态注册的也好,它是不是都放到了这个并map当中。
02:07
放到这个map里面。呃,在哪个里面了,就是我们上面画的图,就是在这个里面对不对,在这个里面的话,他已经我们刚才已经看他,他已经把b factor拿到了,那么他肯定从里面可以拿出来,所以说他都能拿到你自己提供的这些类啊,这个可以不算啊,这个可以我们先不用管,就这里是他都能拿到,包括类置他都能拿到,拿到之后是spring的大前提是我首先找出所有的子类出来,先找子类,那么子类的话他怎么找呢?啊,他先找通过API提供的。这个为为什么,你先不用管,我等一下会给你解释源码,所以他第一个应该打印的是什么,按照这里的打印的规则的话,应该是这样打印的,我们来看这个C的,他该打印的是C啊S,它就打印的是这个嘛,我们简单写一下,它应该是第一个打印的是C,它的类型是S,并且的话呢,它的一个方法的话。S啊,诶。S它的方法的话,我再放大一点啊把字体。
03:01
方法应该是什么东西啊,是S-P吧,我们写个SP啊,就是这个嘛,就打印的这个SS-P。诶,我这里开了一个放大镜,怎么关闭它,先停一下录屏啊。好停掉,那接着来啊,也就是他应该是在在有没有在录在录啊,他应该是什么SSP对不对,这个来源我们就不再说了,是API提供的,好了我们接着来,这是第一个,呃,找完了这个之后的话,那么10分钟接下来会执行内置的,嗯,这里面我先给大家画一个东西啊啊,我给大家画什么东西,就是这个B边是map啊。他当时不能执行完扫描之后的话,他现在还没有执行到,我们先不再说,等一下再来画啊,咱们接着来吧,啊第二个的话,按照是按照我的理解,是不是应该先执行是内置的,那么内置的它打印的应该就是这个CCPP对不对,因为我们刚刚说了,我们我们直接给他CCPP应该是这样子,然后的CCPP是杠,还一个是个S,然后执行的它的什么SP,它的什么就是子类的那个post的方法嘛,好这样子这是第二个,好第三个的话呢,那么这个就执行完了内置的作用,那么spring就开始执行,还是执行这个绿色的,那么绿色里面它要执行啊优先级最高的也就是这个什么I,因为I执行的pretty order, 我们说过pretty order它是来改变优先级的,所以这个地方就是什么,就是I。
04:11
杠S,然后杠什么的SP这是I的呃呃指类方法对不对,好I执行完了之后的话,那么他们之间的话就没有什么区别了,就是剩下的是什么东西啊,这个C也之这剩下是DFG这三个,这三个的话,他们之间是呃没什么区别的啊,都是都差不多的对不对,那么他就按照字母顺序,字母顺序就是可能是D啊。啊,当然了,你这个J的话呢,呃,其实这个地方我应该把这个写成就这个地方应该要是他的级别要高,比如他是一个低,那如果这个是J的话,那就是什么东西啊,如果打个比方是这样的,那就会有问,因为这个是后来注册的,他肯定会有一定的问题,那么我们按照就不去改了吧,就这样子的好吧,那么首先第一个的话肯定是什么D啊。啊,按照字母顺序来吧,D-S大写的S-SP这样子啊好。然后呢,下面一个就是F,所以说是什么F-SS-S,这里面你可能比较懵,但是你一定要听,如果后面的话你就知道我在总结什么,如果这里你不听的话,你就后面不知道我在总结什么好了,最后是J-S,然后的挂JP啊这样子应该是这样的好了,那么所有的负子这算所有的什么,这些什么子类的子类方法就执行完了,那么按照我的理解的话,那么是不接下来会来执行什么样的父类的子类的负类方法,什么叫子类的负类方法,因为这个地方它执行的什么子类的子类方法,那么子类它不是有两个方法吗?那么Spring类的原则是执行完的子类的子类方法,它会执行类的子类的负类方法,那么这个顺序的跟这里是一样的,那么首先也是什么呢?找到这个呃,API注册的C,这个时候执行的什么啊,C同样是子类,只不过这个时候执行的是什么东西啊,是负类的方法,因为它是PP是这个意思啊啊,他打印的一个是就是这个P表示负类的这个负类方法PP,然后呢,接下来就是我们的这里改一下,都是一样的后面。
05:58
的角度就是这样子,然后就是嗯,叫做呃杠S,这是也是,这是PP啊,简单的PP。
06:06
好了,我这个是随便画的啊,只是给大家写一下I的话,同样的啊PP。嗯,然后的话,第一啊,这个我这里复制了啊,这里是一样的。批评。这个地方有点闹,你仔细听,如果你没听懂,把录屏停停一下,再回过头去再看一下我在说什么,好吧,好了,然后呢,接就执行完了哈,那么到此为止,子类的就所有直接实行的的,就是绿色这一块的啊,他的负类方法执行完了,子类方法也执行完了,那么接下来他就要执行这些灰色的了,执行负类的了。呃,直接实现了负类的这种类型的,那么他先执行谁呢?他也是根据这个原则一样先执行API提供的,那么这里谁是API提供呢?BCAPI提供的,所以这个这应该打印什么?就是我的B大写的比较杠,那么这个时候它就不是S的,因为B是属于一个负类对不对?杠P表示负类啊,那么这个时候它是PP之接负类的负类方法,因为这个负类是没有子类方法的,好B-P-PP,好那B执行完了之后的话,那么接下来执行这些,呃,其他的了,那么内置的我们不要管,因为内置的这个spring,其他内置的话我也没去,没有没有去打印日志,所以我们这里不用关心,其实这里面有很多spring类置的,只不过我们没有打印日志对不对,所以看不到,我们不去关心了,我们只关心我们自己提供的,那么自己提供的根据级别来讲,H的级别是最高的,因为它加了什么样的pretty order, 所以接下来是什么呢?H-PP这样子啊,好,他应该是H这个地方是。
07:25
H大写的H是吧,好,接下来就是什么呢?A和1这样子啊啊。A, 这个地方是。因为A的怎么样命名顺序比1高,所以他要执行在1之前,好我猜盲猜大概它是这么一个顺序,那么究竟是不是呢?哎,我们来跑一下看一下是不是啊,呃,直接跑我们我我我我也不太确定啊,我也是猜的啊,我们来看对对一下看是不是啊,第一个是CSSSP,我们来看一下是不是啊,SSSP为什么呢?因为它的来源是API,我刚刚讲过,刚根据识别源码来的话,它是第一个要执行,我们怎么样呢?通过API提供的绿色的,比如说CD优先级最高,第二个的话,执行spring内置的,那么内置的就是我们的CCPP-S-SSP,我们看一下是不是来CPP-SSP没有问题,因为它是类似的。好第三个的话,按照我们说的话,它是什么?I的就是他们俩执行完的,剩下的是ii的话,它是一个什么呢?级别是最高的,因为他提供了pretty order的接口,就是你pretty order的接口责任提供了不,不管你的数字是多大,就比率是一千一万,他都要比没有提供的那个级别要高。如果说你提供了两个,比如是。
08:36
还比如还有一个什么Z对不对,Z呢,也是一个子类,它也实现了play,那么他们之间会根据那个返回值进行比较,就play order不是有个仿回,就get order方法呢啊get order的方法吗?它会返回个in特值,对他们俩进行比较啊,但是如果说你提供了pretty order接口,但是的话呢,他们没有提供它的顺序永远比他们高,不论你返回多少,所以这个I的级别一定要高,接下来就是什么呢?Is SP, 我们来看一下是不是,也就是说呢,我们刚刚看完了这个内置的,那么接下来就是什么is了,SP了,那就是没问题,好,接下来呢,I执前完来之后就是什么呢?DFG, 我们看一下是不是啊是吧,DSSSP了,FSSP是吧了,这个F是那个打印的,就是我们打印注册的这个机嘛,对不对啊,在在这里打印,我们来看一下这个F,这个这个不是顺序,是在同一条代码里面打印的,所以在这里面表示了我们已经把J注册成功了,那么就是什么JS啊,这里面少了一个SSP的这里面没有写,我们给他加上过来,这里面少了一个S,比如他是子类方法,因看他是不是子类方法,他还有一个复类方法在这里啊,复类方法应该叫他个P-P的P-P应该是这样子啊。
09:36
好了,我们再跑一遍,那么我们已经看完了这个阶啊,也就是说了,我们到这一步已经看完了这个好,这是子类方法,子类方法呈现完了,我们接下来看负类方法,也是到这里就看完了,刚刚来来好接下来的话呢,那么负类要执行子类的负类方法,那么这个这个原则是不是一样的,首先执行你提供的通过API提供的子类的负类方法,也就是C的负类方法,C的你看吧,它首先执行C的子类方法,有没有它当所有的子类方法,当所有的实现的这个接口的这些子类方法,执行方法,还要执行它的负类方法,那么它的原则是一样的,首先找到,所以说过API提供的子类的负类方法,也就是他,那么这打印的个什么CSPP来,你看是不是CSPP来,你看看后台打印的也是什么CSPP的,好,那么C执行完了就跟这里一样吧,CCPP我们来看一下是不是,你看吧,CCPPP的PP负类方法吧,CCP是一个子类嘛,因为它直接实现子类吧。好,接下来是什么东西啊,Is PP, 我们来看一下is PP, 好接下来是什么东西啊,我们的DSPP。
10:36
就是我们的这个DSPP好,没有问题,接下来是什么东西,FSPPFSPP, 接下来是什么呢?我们的GSPPGSPP没有问题啊,那么到此为止,其实我们到这一步的话,已经把所有的子类就是吧,直接实现子类就是就是绿色的,无论它的子类方法和负类方法都执行完了,你仔细看一下的,比如说这里面的C,你看它的子类方,子类方法是在这里执行的,负类方法是不是在这里执行的,FSP表示子类方法,PP表示负类方法,你随便找一个,比如这个FF的负子类方法是最开在这里FP,它的负类方法呢,是FPP的,所以说到此为止,所有的这些绿色的,无论它的子类负方还是负类方法都执行完了,那么站在十分角度,他是不是要来执行,现在要执行负类的方法,执行就是直接实行的负类,就这种灰色类型的,而这种灰色类型的他怎么执行呢?那么它的原则也是一样的,先执行API提供的,也就是B,那么我们来看一下,应该接下来是BPPPB呢,PP的B是一个负类,它。
11:36
它负类的执行它的负类方法,因为B没有指类方法,B是直接实现了负类的,所以是什么呢?BPPP是不是好,然后就是什么呢?接下来执行什么其他的,其他的话呢,那么就要看你有没有时间play order接口,那么这里面实际就是H,所以就是HPPP,那HPTPP好,接下来是A1,完了,A1和A的顺序比我们的1,为什么他们两个就是我为什么提供两个呢?也为了验证前面讲的,在同等的情况下,字母顺序就是顺序A比1的级别高嘛,哎。
12:04
这样子。好了,那么这个就是他们的一个执行顺序,那么他们为什么就是怎样才能做到这个保证这个执行顺序,那就是十分源码底层写的,而且他为什么要这么做,为什么要搞成这个顺序出来,那么接下来我会跟大家讲源码来解释,好吧。呃,就是你听完这节课之后的话,我希望你就是拿到我这个代码之后,你也自己能够猜出来,也不能说猜吧,就是根据你自己的理解把这个画出来,那么将来你再看,因为我们在所谓的做spring扩展的话,你无非就是扩展这些东西嘛,对不对啊,你不相信的话,我这里有没有啊,有没有my balance的一些扩展的,我给你看一下你就知道了,你看my balance好多一些扩展的,无非就是这些扩展啊,这这些东西啊,我看看有没有啊。啊,就无非就是扩展这些东西啊,还什买白写在那里面,就是你你如果说你去掉一家公司,或者说你将来去做这种开发,或者说你去看别的源码,他无非就是扩展这些类啊,要么就是并def possible么就是be possible, 要么就是我们的这个import,并要么就是import select, 那么这些执行顺序你一定要清楚,不然的话,你扩展出来的话,这个机制不对,会导致你的代码的话呢,会有很大的问题啊,它的一个执行顺序是相当相当重要的,就比如说你要扩展扫描,那么你要去怎么扩展它,你要知道他哪个时间完成的,那就是非常非常重要的,我们那个买白这个类在不在这里。
13:15
啊,这样子我给你看个map时看你就知道了啊,你看它无非就是扩展这些东西嘛,就说白了,我们随便写一个了,Art map时看mappr来,比如说它你看这个注解嘛,它里面提供了就import了一个类进能导入这个类,这个类的话,你看它就实现了import并点打,而且这个里面的话,它又注册了一个,做了一个类,叫做什么呢?叫做呃,Map sc con f, 你看这个类啦,它就是扩展了,我们这个病DEMO就是port是的。你要知道买白为什么扩展它呀,他的执行时间是怎样子,对不对,他说什么,通过什么手段提供的,他的执行顺序应该比哪个高,比哪个低,有的时候就要高,比如说买白的扫扫描,因为他就在这个里面完成了扫描,你自己看了,你只当然我们这里今天不是系统讲啊,我只是告诉你看这里面他肯定完成了扫描。你看这面呢,Scanal对,Class对,Spring这些扩展的扫描嘛,那如果这个执行顺序你不搞懂的话,那很多时候你提供那个类对不对,你又去扫描就重复了啦,所以你要把这个顺序搞明白,大概这个意思,我只是说一下这个里面如果听不懂,没关系,我就告诉你,就是你扩展无非就是这些扩展,你看嘛,我们刚刚看到的一个那个什么,呃,这个类的import b对不对,还有这些什么be possible, 以及我们这个be possible等等之类的,无非就是这些东西,那么你要把这个顺序搞清楚,这个顺序都不懂,你看到一个类你都不知道什么,他的执行顺序是谁先随后那。
14:33
对不对,那就不应该就是你你成为一个大师对不对,成为一个不人大师对不对,你就是要做的这种,看到一个人你就知道他什么时候执行啊,大概是这个意思,我不知道你们能不能跟得到我讲我你我讲的啊好,接下来我们正式来开始对这个源码进行分析,看一下他为什么可以形成这个,呃,这么一个固定的这么一个顺序啊,就以及他为什么要这么做,是不能。
我来说两句