00:00
好了,那我们接着来啊,呃,我们刚刚已经看到了,他已经回调完了子类方法,并且呢,他把就是说如果你图个API提供的负类方法,他是一开始没有去回调,他已经把它存起来了,这个也需要跟大家说明啊,嗯,我们也在这个地方给他。给他那个吧,好吧,就给他写一个注释吧,就是在这个里面的这个B的话,他应该是并没有去,呃,调用就是一开始这个。B的话。呃,整个这个图要结合来看啊,因为这个东西它确实有点复杂,他不是说讲像像我们讲其他一样,就是这么简单,所以你要一直要结合这幅图,你看到这个B就知道去看这个对应这幅图,就是说这个B它是一个通过API注册的一个负类,对吧,直接实现了负类的,那么这种情况的话,像B这种情况,他应该是一开始并没有怎么样,没有回调。啊,仅仅是怎么样呢?呃,缓存起来。就存起来嘛,啊,还没有去回掉啊,这个时候啊,好代码我们接着来往下看,把这个关掉吧,嗯嗯,到那么就到了这里,这里面他又定义了一个病人叫current,呃,Reging, 嗯,Process, 好,这个东西呢,就比较的重要了,我要先画图。
01:12
呃,就是他啊,当然它里面存的也是一个对象,诶可以看到啊,他是一个叫bein post的这的对象啊,嗯呃,我这里写的并in版,然后告诉他这里面存,呃就是子类嘛,我这就不去写了,反正它里面存的是子类,直接实现是子类的,那么他这个定义出来这个类似的有什么用呢?它是用来存储。当前需要执行的啊病,当然这个病的话,我再给大家写一个,它就是子类啊,因为spring现在先执行的是子类嘛,我们刚刚从这个里面也可以去看到呃。我们上次不是执行那个结果吗。在哪里呢?就是在这个地方,我们也看到一个原则,就是不是先执行的是这些绿色的,也就是子类嘛,好他为什么要定义这个,呃list呢。
02:00
并且要把什么叫当前执行的,就是这个历史的意义在哪个地方,首先它有两个意义,第一个它是当前的啊,第二个的话呢,就是呃呃,他要存储的这些词类啊,那么这两个意义分别是什么意思呢?因为你这些绿色的有这么多。有的呢,已经对,你看这些东西对不对,有这么多对不对,有的呢,Spring已经知道它存在了,比如说这个C啊,那spring是不是已经知道他,并且他已经调用完了,我们就把它排除吧,我们来看其他的C的话,他已经执行完了,我们就不去看了,你包括里面还有什么了,比如说这个CCPP,斯不伦他已经知道它了,为什么已经知道他了呢?因为这个CCPP它是属于spring内置的,也就是在我们的斯spring农器实例化的时候,这个CCPP呢,Spring已经把它变成一个并存到了这个并in defin map当中,也就是这个红色里面,它是包含了这个CCPP的。但是有的呢,Spring是不知道,那比如说我们这里面是d f gii这些是不是目前来讲他还不知道,为什么不知道呢?因为我们这些DFC,呃,GI啊,这个东西你是写在你的这个程序里面的啊,比如说这个呃,D对不对,他是要通过扫描之后,什么人才知道它的存在的。
03:11
那么目前来讲是不是是不知道的,所以说呃面对这些,呃已知的或者未知的,或者说呃不同来源的,比如说有的是通过什么API注册的,有时候通过扫描出来,有的通过动态注册的,对不对,有的是类置的等等,这些就不同的类,不同的来源的这些这些啊,并是不是不是不可能一开始就全部把他们找出来去一起去执行的,那么什么人的原则是分批执行好,这里面给大家写一下啊。他的原则是面对这么多这些,呃,不同来源,不同类型,不同的一些什么什么之类的等等的这些资料,他的一个原则是分批执行。这里要解释一下,为什么需要分批执行呢?打个问号啊,其实很简单,因为怎么样做不到一起执行,那么又有又有这个问题,为什么就做不到一起执行呢?很简单,因为这些类啊,你比如说这个这个低的。
04:07
他要被执行的话,他的前提是能够被什么人找到,被发掘对不对,而这个低的发掘呢,它是依赖于我们这个什么样的内置的。好,如果你听不懂,你再看这个来,比如说这个J,你如果要让这个J执行的话,你是不是得让他生效,让斯芙瑞发觉到,你要让这个J要被斯芙瑞发觉到,你必须要执行这个F,因为只有当这个F执行了之后的话,这个F会把J它变成一个b def, 放到这个b def当中,那么spring才能感知到它,然后才能实例化这个J,然后才能执行,因为我们前面讲了这么多,我已经总结了,这个J的话,他必须要能够被斯不论实例化对不对,斯不论要去实例化这个J的话。他必须要存在这个病map当中,因为我们也前面画了这幅图来,你一个病如果要被实例化的话,有个很大的前提的话,要存在这个病map当中,那么spring会去怎么从这个病map当中去,怎么根据你这个病变并分对象里面的信息,决定这个对象能不能被实例化,以及怎么实例化它,所以spring实例化一个病的话,很多的情况下都是怎么样的,通过这个病Di的对象来实体化,当然也有一些不需要啊,我们这里不再讨论一下啊好,这个能理解吗?就是说他们的之间是有依赖关系的,就是你这些D呀,F啊,J呀,I呀,这些对象的一个实例化,或者说能够被spring发掘的一个前提是依赖于这个内置的,也就是说1000~1万这个内置的这个类,它会去完成扫描,比如说这个类置的这个类的方法,子类方法,就是我们看到这个什么CCPP的这个SP这个方法,它里面就完成的扫描,那么一扫描就把我们的I呀D呀,F法给扫描出来的,那么他们才能执行,所以说他们不可能一起执行,你要执行这个D的话,先要把这个执行完了。
05:46
才能找到这个D,好,这个不知道能不能理解,那么我们来现在怎么样呢?给大家证明一下啊,那么怎么证明呢?好比说他这里定义了一个current的对不对,那我们断个点到的这个地方,当我们的代码运行的这一行的时候的话,其实你发觉这些什么样呢?啊,DFG它是感知不到的是不是,但是他能够找到这个内置的,那我们来看这个并FA当中,我们把它展开啊,啊并在分是呃,Map当中啊。
06:10
在这里六个啊,那么你展开它,它这里没有没有那个什么DFG的,但是它里面有一个CCPP在哪里呢?我们可以给大家看一下,就是这个叫做应该是他吧,它的名字比较复杂,它叫什么,叫个什么intent,什么configuation iation process, 我们把它展开,你看一下它所对应的类是谁就知道了啊,把它展开啊,来看一眼它所对应的类b class嘛,你看这个就是什么,他的一个b class是谁呢?是我们这个configuation class post, 就是我们的CCPP,因为我们这个地方是简写的,对不对,我们不可能把这个名字写这么长,这个图就不好看了,所以说他是在这个病的map当中,也就spring现在能够感知到它。那么这个CCPP呢,我们把它找到啊,它是不是一个子类的对不对,其实confi啊,SFIG.
07:00
Classic possible citizen.就是他了,你看他就是一个子类嘛。他是不是在这里?Possible system, 其实我们从这个图上也可以看出来啊,只不过我这里再说一下,好,他是能够被spring感知到的,但是其他的感知不到,所以说他们必须被分批执行,他们做不到一起执行这个呃,现在懂了吗?那么由于要分批执行的话。那斯不论的话,你你你分批的话,这个批次,这个所谓的批的话,肯定是分批的批这个字啊,他肯定是多个对不对,那么你这个找出来这个一个批次,你要去执行他们,你得先把他们存起来的,所以它要存到这个历史当中,好,那么什么叫当前呢?因为是分批的,就是它是什么,就执行实际执行的这个呃呃呃呃,时间是不同的,所以当前这一次执行的,他就把它全部存到这个里面,然后呢,如果要执行就找完了边,他不是分批嘛,不就找到一批,找到两个,把它放到这个历史当中,然后呢,把这个历史的传过去,那边进行便利,便利之后的话,一个一个执行,执行完了之后再把这个历史的清空来。
08:04
清空了,由于你刚刚执行的这个C啊。行的,这个CCPP对不对啊,执行完了之后的话,他我们刚才讲他会去完成我们的扫描,那么是不是扫描出的DFGI,那么这个时候呢,是不是又要去分P执行,比如说这个时候他找到P是找所有实现了实现的普order接口的,那么这个时候找出来这个I对不对,他又把这个I又存到了这个list史当中来。那么这个current re rejection, 就是当前需要执行的,刚刚当前需要执行的是什么呢?是CCPPP对不对,他当CCPPP执行完了啊,当CCPPP执行完了,他就把这些给扫描出来了,然后呢,是不接着再去找,那么又找到了AP,找不到,他又把它放到那个color历史当中,好,那么去执行,执行完了之后,他又把这个历史的清空,清空之后又去找,比如找什么DF,对不对,找出来两个,把他们两个呢存到这个current的list当中,然后呢,又去执行,执行完了之后又把它清空,又去找,找出这个G,然后又把这个G存到这个current list当中,然后呢,执行完又去找,直到找不到,所以说这个current,呃呃,Re processed这个历史的意义我不知道你们能不能理解。
09:08
啊,如果你不能理解,我们等下看代码去调试就能知道,但是首先你得把这个理论好好听一下,如果你这里没有听懂的话,再把这个视频倒回来之后重新听一下,理解一下这个color的post的意义在哪个地方啊,嗯。好,如果你听了两三遍还是没有听懂,没关系,对不对,或者你似懂非懂没关系,那你接着往下听,我们会通过源码来给大家解释啊,那么当前来讲他应该是空的啊,来我们来看一眼,因为他刚刚刚开始被呃6出来嘛,它是空的,放在这个地方好,然后代码接在往下执行,这里面定义了一个叫做呃,Post process name姆斯,那么这个我就不画到图上了,大家可以注意一下就可以了,我先把这边删了,那么它一开始定义出来的话,讲到理是空对不对,因为一开始这个定义目前来讲是空嘛,还没有执行账号代码是空,然后呢,它就等于什么呢?等于被factor的点get names for type, 那么这个代码呢,我们说了,我们这我们这节视频的话,只会讲这个代码的一个表象层,并不会讲到这个里面去,这个里面的代码是相当复杂的啊,非常非常复杂啊,啊我们就不再去说了,我只是告诉大家这个最终结果他就是怎么样呢?我们可以看这个代码的一个呃方法的一个名字,它是什么?拿到B的名字,通过类型啊,说一千道1万,他就是能够从思不的逻辑当中,根据类型找到这个呃病的名字,那么整个思不。
10:19
实际可能很多同学理解错了啊,很多同学理解的是分容器,就是其中的一个单离子,就是说理解的可能就是我们的B啊,被实例化之后的那个存放那个容器,并被实例化之后存放的那个容器的话,我们一般把它称之为单地池,在这个图上应该有给大家找一下这个图来,比如说我们其实我们可以把整个这个称之为一个十分容器,那么在这个实分容器当中的话,它有一个叫做single object斯,那么这个里面呢,它其实就是我们通常讲的这个单利词,那么很多同学会把它理解成为一个我们的spring容器,其实这个理解讲到理是个错误的啊,那么它里面存放的就是怎么呢?所有怎么样呢?已经啊实例化好的单利病。就说白了,你们平常用的那些什么service啊,Do啊,什么controller啊,这些东西啊,都是存放在这个东当中的,那么它呢,也是一个集合啊,它也是一个map,它这个地方spring底层是用的是一个map啊,你可以把它理解为个list啊,如果你没有看过这个源码的话。
11:13
就是你通常看到那些什么service啊,啊,你们自己就是不实力化好的一些变,它就存在这个里面的,但这个你不能把它理解为思维容器,思维容器它是一个非常抽象的啊,以后有机会我们慢慢去把这个东西给他说清楚,嗯,那么刚刚那行代码叫做。Get bin name斯for type, 它是就是说从整个这个四频辑当中,根据类型去找到一个B的名字,那么就包含了这个bin map, 对不对?好,他传了一个什么进去,传了一个叫b def PRO possible, 也就是说我们先如果说比较的局限的去理解的话,你可以理解为刚刚那条代码就是从这个b def map当中去里面去怎么样呢?找所有类型为possible的。那些呃呃呃呃呃,并def defense, 呃,如果有的话,把他的名字返回出来,也是把他的key找出来,那么这个当中有没有有有有没有了,肯定有一个,就是我们这个CCPP对不对,因为我们刚刚说过了,这个变data map当中它是怎么样的,有一个CCPP的,也就是我们这个,而我们刚刚又知道CCPP的话,它刚好是一个绿色的,也就说它是我们的一个子类,所以它是能够找出来的,那么我们这里面其实内置还有其他的对不对,其他的我们先不用关心它应该是不是的,它不是这种属于这种子类的,所以这里面能够找出来一个,那么这么一找出来,找出来什么就是我们的CCPP,当然这个名字它是很长的啊,我们这里面不可能把这个名字写写传,我们就简单理解它CCPP好找出来之后的话,那么代码接着往下执行,它就会进行便利,那么里面现在只有一个啊,便利出来拿到这个什么CCPP之后,对他进行一个判断,他说你这个CCPP是不是一个实现了pretty all的接口的这么一个,呃,类型的这么一个病,那么它是不是啊,是这里是因为我们也看过源码,就是我们这个CDPB确实实现了这个什么叫做P的这个接口啊好,如果是的话,这个if成立就。
12:54
再往下走,那么他就把它放到了这个什么current这个list当中啊,并且把他的什么呢,这个并betterly get b.
13:01
这个代码的话,我要跟大家说明白啊,并发get病,我这里写的就是他会去实例化。并factory get的病的话,呃,如果你经常听我讲这个视频源码的时候,就会知道be factor get病,它有两层意思,如果这个病已经被实际化好了,存到了单列池当中,也就是存到了这个,呃,我们刚刚说的这个图当中的这个单例池当中啊,如果他已经在这个里面的话,那么是不是会直接把它拿出来,但如果说单例池当中不存在这个病。你又调用了get病方法,而且刚好这个病呢,它如果存在我们的并d map当中,那么他就会去实例化,它如果说并better里get病in,你get这个病in的名字,它不在单例词当中,也不在这个病单map当中,也不在这个里面,那么他就会爆抛异常,所以说病factorly get病的话,它有两种意思,第一个会去拿病,如果有病的话,如果没有病,他会去实际化,当然实际化的前提是你存在这个病在当中。所以这行代码就会去,怎么样呢?把我们这个CPP去实例化,为什么CPPP能够被实例化呢?首先它存在我们的这个病态标当中,对不对啊,第二个呢,它并不在我们的这个单例史当中,所以说他这个地方或者实例化,我们的CCPP实际画好之后,把它放到了这个什么东西啊啊,这个历史当中,好,然后的话呢,我们先把这个图画出全吧来,那么经过刚刚那行代码之后的话,那么我们这个呃,Current当中的话,就有了一个谁呢?我们的这个CCPP好吧。
14:22
CRCCTRL位复制一下,好,那么他就把它扔进来了,扔进来时候的话,这个地方的话,我们也给他写一个,呃,备注吧,就是这个情况,它是什么情况呢?第一个他已经实例化好了,因为他是通过什么get并in方法,Get并in方法啊,实例化好实例化呃实例化了啊然后第二个呢,他怎么样呢?没有执行,他仅仅是没有没有回调,他的个没有回调,没有回调他的指例方法,对不?我们就简单写一下,没有回调,因为他仅仅是把它怎么样实例化存到这个里面了,好这个就说完了,说完了之后的话,那么代码接着往下执行,到了这行代码process的并点ADPM,这个PM就是我们这里面拿到了这个这个的,因为他是从这个里面编辑出来的,对不对,就是把CCPP呢,这个名字存到了这个process bs当中,那么存在这个里面,好,这个里面就是我们刚刚看到的这个啊,那么这里面就存在一个CCPP。
15:11
C CL way, 注意它这个里面存的是个字符串,我用个双引号表示它存的是呃,字符串CCPP存的是B的名字,那么它为什么要存在这个里面来呢?就表示你看什么已存的什么已经处理的过的病的名字,那么这个是什么意思啊,各位看啊,因为站在斯不角度而言的话。他要分批执行对不对,分批执行的话,那么每次都要重新找,那么如果已经找过来的话,他要做一个记录。防止重复执行,这里面就是测试,那么他怎么防止重复执行的,你先不用管。那么从这个单纯从这个代码的意义而言,他存的是已经处理过的,那么什么叫处理过了,就是spring已经找过了,已经把你找到了,就是我已经呃知道了你将来要执行的,那么我已经找过你了,我先把你存储起来,我将来呢就怎么样呢,不要再去找你了,就防止重复执行,好如果你不理解,没有关系,我们等一下看这个啊,Prob在什么时候用就知道了,先实你大概了解一下,他就是因为什么存储的已经被找出来的这些病的名字在这里面,好,那么就找完了,找完了之后的话,然后进行了一个排序,Short啊,那么这个不需要关心,为什么呢?因为这里面就只有一个对不对啊,就是你他为什么要排序,因为他这里走的是什么呢?所有实现了pretty order接口呢,如果说你这里有两个,那么他要进行一个排序,排序的一个原则的话呢,它就是什么呢?当然我们也可以简单看一下啊,这里就不去看了算了,因为这个代码比较复杂,总之它就会根据这个,呃,你实现的po的这个接口,这个po的接口它是不是有个方法叫做什么样呢?叫做Get all的这个方法对不对,那么这个方法它会去返回什么样的值嘛,然后越小的优先级越高,所以它这里面进行一个排序,我们这里面就没只有一个,就不去关心了,好了,排完序之后的话,它进行这个什么re j, 你抛出来A。
16:45
第二,然后呢,把这个卡进行了一个合并。那么当前这里面就有一个CPP,那么就把它放到这个re process process当中去了,啊好把把它放到了这个reion当中去,当中是在这个里面哈,那么就先呢,就把它这个,但他合并过来的话,那么这里只有一个把它放进来了,好这里面需要写一个备注的是什么呢?就是它呢,目前来讲它是怎么样的。
17:06
没有执行的对不对,他只是把它合并了出来。将来他肯定是执行完了的。就是我们这里先说一下。就是合并的时候。没有执行啊,还没有执行,当然了后面才会执行,我们先留到这个地方好了,合并完了之后的话,In work并factor post in work并def release, 你报错了,这是然后把这个current的传过去,你看嘛,当前需要执行这一批传进去,传进去之后的话,那么的话就会去怎么从这里面便利,便利面这里有个CCPP对象,对CCPP,现在目前来讲是CCPP这一个对象了,CCPP好,然后的话去回调CCPPP的possible c def, 那么这里面的就是CCPPP的话,它的一个回调的话。他如果一旦执行的话,他会就完成我们的扫描,当然我再强调一遍啊,CCPP的这个possible be def方法里面干的事情非常非常多,就是这个方法如果要讲的话,可能要讲十几个小时,都不一定讲的完,我们这里面先不说,总之你记住一点,他完成了扫描好,如果他一旦执行完了之后的话,那么他一旦完成扫描的话,那么我们比如说这行代码执行完了之后的话,至少我们这个并map当中就会去多一些对象,多哪些对象呢,我们也把它列举出来啊。
18:15
多哪些对象,第一个我们从这里来啊,呃通过呃这种注册的AEP啊,D Fi这几个会多进来啊。CTRLCCTRL, 我复制一下好放到这个地方来。我画小一点,因为这里面东西比较多,我们到时候的话就是分两个来发。A呀1呀,这个呢,已经被扫描出来了。这个我就画大一点好吧,画这么大啊好,然后还有什么呢?还有我们的DFJ为什么没有呢?因为J的话,它并不它并不是通过什么啊扫描的,它是通过F动态注册的,所以这个里面讲到的是没有这个JR,但是D跟F是肯定有的。
19:01
好了,放到这个B的map当中来了,现在这个b map目前来讲就是会多了这么一些类,其他的,还有一些其他的可能,比如说呃,我这个当中如果还有其他的B的话,那就不考虑啊,比如说我看一下还有没有啊,应该是没有了,就这样啊,好,那么这个就是我们嗯的这个代码的一个呃,执行的一个结果,然后呢,就把这个肯定也掉,那么这行代码肯定也掉之后的话,那么这个里面的就没有了啊。就是这个这个东西什么都没有了啊,我这里就不去删,等一下我们调试完再来删啊,简单的话来说,他应该是没有了,只不过我们这里面我说了我要保留,我们等下还要来调试嘛,还没有讲完吗?好,那么这个就是我们代码级别的一些,呃阅读,那么我们现在通过源码来调试看一下到底是不是这么个情况,整个这个方法读完它其实比较的麻烦啊,大家先慢慢去看啊,好了,我把它停掉。
我来说两句