00:00
嗯。好的,那我们,呃,接着来啊。我们来看一下,就是说前面讲的这些代码,它的一个执行顺序的一个原因,那么也就是说我们要去看这个源码,首先我们来看一下它是怎么被回调的啊,就比如说我们这里有一个A啊。这个类的这个方法,呃,Spring是怎么回调它的。呃,代码非常简单,也就是说他是在这行,在这个方法里面对吧,对吧,我们先不去看这个源码,我们简不去整体的看这个源码,我们先来了解一下它怎么回调的,他的回调方法很简单的,比如说当有一天spring把这个给他找出来了,对吧,找到了这个A啊,那么你看他怎么做的,他把这个A放到了一个list当中,那么在这个post当中肯定有这个A啊。我们这里写个注释,假设我们这里是吧,我们只是看他怎么回调的。假设这个list当中现在有一个A,他他去便利这个list,那么拿到这个A,对象直接调用这个A的。Post process being factor的方法,也就是一掉的话就掉到了这个A这里来了啊来。
01:02
所以他是这么回调的。呃,于是我们来想一下,就是我们来总结一下,就是他回调的话必须要有几个,呃,有一个前提条件,就是这个对象是要被实例化的。呃,到这里吧,就是他你这个A肯定要是个实,你看他没有实例化,就是他放到这个历史当中的话,他肯定是一个对象,我们这里要说他肯定能够被怎么实例化成为一个对象啊,这是他回调的一个前提,这个需要,呃,那个呃明白啊,那么在他呃成为一个对象之前的话,那么spring肯定会要先去找到他的类啊,嗯,其他的它的子类肯定也是这么回调的,比如说这种呃C啊,那么他也是一样的,我们也可以看一下,因为它是been possible, 那么子类的回调的话,大概在上面这个地方,呃,在这里啊。那他也是一样,那么他传了一个历史过来,在在在这里啊,这个看什么,看了一个什么。嗯,这个connection当中就是一个集合嘛,比如说它里面也包含了一个C,刚好,那么这个C的话,提现它肯定也是一个对象,好,然后的话他就便利这当然这里面可能还有其他的,比如有D啊,有E啊什么之类的种种,我们我不先不管,总它是个集合,里面假设有存的一些子类,那么他就会去对他进行遍利,便利出来达到这个C,那么回调这个C的子类方法,Process process并DEF方法,对吧,好,CTRL回加B,那么你一找的话,找到这个C的话,那么就回调过来了,所以他的回调大概是这个意思,就是有一个前提需要把这个对象给实体化,嗯。
02:26
呃,记住这个前提,我们接下来看源码啊,好,源码的话我们直接,呃还是点一个麦给大家,就是他怎么过来的对吧?呃,从最开始就是我们的十分容器实例化,呃,初始化类方法之后的话,那么他就执行这个E并post process的方法,呃,执行这个和post process的方法,我们现在来关注一下当前整个十分容器当中的这些ABCDEFEFG他们的一些情况啊好,是这样子,我们打开这幅图,就他们的一个形态。到底目前来讲,它是一个什么样的一个情况啊。
03:01
嗯,呃。首先这里面有一个并y possible process是这个list对不对,那这个list它是存在于我们的,呃,在这个里面呢。Get, 也就是说这个里面他现在在这个当中的话,他应该是有两个对象的,好,这两个对象分别是我这里要给大家说明的是,他这个里面存的是对象。啊,对象就是怎么已经啊。实力画好的。往上一点。啊,那么这个里面有几个呢?有两个。这是我们的。B跟C吧。写个B吧,那么这个B的话,它是。灰色的,它应该是继承的,呃,实现的这个接口。啊,就是。
04:02
为什么有一个B呢?我们这个大概应该应该都知道吧,因为我这里面怎么放了一个呃呃,B进去啊,诶这个B应该不是子类,它应该是个负类的哦,刚刚说错了啊,没关系啊,好,那我们把它变成一个灰色,没错,我刚没说错,是啊,就是灰色啊。啊,这个颜色有一点啊,就这样子吧,好,它还存在一个什么样呢,一个C啊。那么这个C的话,它就是一个子类。它是一个直接实现的类,我们这里方便就是说他叫叫子类算了,就这个颜色啊,他应该只存在这两个啊,我们等一下也可以通过去断点去可以看,我们先把这个图给它完善,那么就存了一个B跟C,也就是说当我们执行到这个方法的时候的话。去执行到以work和并派possible,这是代码执行到这里的时候的话,这个绿色当中它应该有一个B,有一个C,这个是毋庸置疑的,我们刚刚已经知道了啊,因为我们看到代码是我们自己把它放进去的,好,然后还有第二个组件就是我们的。在这个传过来这个什么呢?Be factory这个对象当中呢,这个啊,它有一个呃,此类叫做default Dis be factory, 在这个default Dis be factory当中的话,他有一个叫be def map, 这个我们前面已经说过在这里了,那么这个并def map当中,它应该有哪些元素,这个并def map的话,大家应该还有印象,就是我前面画的这幅图,它里面存的什么呢?存的是一些,呃,B defin, 对不对,它不是对象啊,那么所以说我们把这个图也给它画出来,就这个,呃,这个的话呢,我们先把它放到。
05:24
这里来吧。嗯,我把这个图画的好看一点,还是要。先把它放到这里来啊,那么把这个东西往下面移一点点啊。我把这些先给它删掉啊。呃,我们来解释这个病,这个病map里面首先他存的。
06:01
是怎么样呢?它存的是一个map key, 我们不是说key就是一个支付串队,我们主要是看说的Y6,它存在是一个叫做ban b different对象啊对象啊,那么我们这个所谓的全都是对象的话,就是指我们的这个什么呢?ABCD本身我们这里面打个括号,就B本身啊,并本身并对象,呃,其实也不叫并对象,呃其实这里面它的KY的都是对象,只不过我们这里面说的对象就是直接这个B对象,而我们这里存的这个并DEF对象呢,它就是一个并defin对象,这个并defin它是一个复杂对象,我们这里面就是跟我们直接的这个,呃,对应的这个ABCD这些对象,这个这里你好好体会一下,如果你没听懂,好好体会,我这里说的啊,就是我他,他们其实都存的是对象,只不过对象类型不同,一个是直接对象,一个是B对象。呃,这样子啊啊,也就是说说1000~1万,我们这里可以理解为就是说这个啊。并得对象对不对,呃,所。描述的类啊,怎么样的,呃,比如说描述,打个比方,描述这个类就是我们的C啊,或者说我们的什么其他的,比如说DEFG都可以啊,比如这个D啊,它是怎么样啊,没有实例化的。
07:08
这个我不知道同学们能不能理解啊,我这里面给大家解释一下来,各位同学看啊,因为b map它是一开始是就为这个b map是一开始通过spring扫描,扫描出来,它把它变成了一个b def对象,这个时候这个B,比如说你扫描出来一个呃,ABCDFG当中任意一个类,你扫描出来之后的话,这个A是没有实例化的,只不过是不是你些实例化一个并DEF的对象,然后把这个A的类呢,关联到这个并DEF对象当中的一个属性,叫做b class给他关联上,那么这个关联是过去的这个X或者是我们的ABCD某个对象的话,它是没有实例化的,这个时候他只是一个类关联了,所以它是呃嗯嗯,一定要讲清楚没有实例化啊,没有实例化,为什么说一定要讲清楚了,因为我们刚刚呃说了他们在回调的前提,还记不记得他必须得是实例化的一个对象,他们才能回调。那么你通过API注册的,那么这个对象它已经是直接实例化了,我们可以直接回调,但是你扫描出来的它其实是一个并data的对象,如果你需要回调它的话,那你是不是还要把它实例化,所以这里面要理解这个地方是没有实例化的啊,那么这个并different对象里面的话,也就说当我们代码执行到这一行的时候,它里面应该有什么呢?它里面有我们首先把它拿过来啊,那么这个呢,我们有一个红色表示它啊。
08:17
这个里面的话呢。它存的是一些那个大红色吧,它存的是什么东西,就是spring类置的一些什么样呢?啊并啊包括了我们的注册类,我们的配置类啊。就是这样子。好,为什么是这个样子呢?呃,我也给大家说清楚啊。是不是内置的BD和配置类啊,那么。为什么啊?那么你我们自己提供的这些的,比如说这些A呀,对不对,加了other component啊,或者这个D啊,加了other component, 为什么不在这个里面呢?因为。这个时候没有完成扫描,因为它还没有完成扫描,就当代码进到这一行的时候的话,其实我们整个论是没有完成扫描的啊,啊扫描的话会在下面去执行啊,等一下我们讲这个代码就知道你的为什么spring的扫描就放在这个地方去执行啊,大家先不用管,总之这个时候没有完全扫描,它里面只存在着我们的内置的并和配置类好。
09:20
嗯。呃,然后代码我我们去就了解了这些基本情况之后的话,那么我们接着来看看看代码啊好,首先。第一行它这里面定义了一个叫set,结合这个什么po是B,那么我们也把这个画出来,画图的时候我就暂停一下啊。嗯,呃,这个process病S的话呢,嗯,它里面存的是什么东西啊,它首先存的是一个字符串,我们先给他说清楚,它是一个字符串是G,也就是这个里面存的其实是我们的,呃,某个对象的名字或者类的名字,它是一个STRMG啊。呃,然后他第一出出来这个集合的目的是什么东西啊,我先给大家说,如果你这里听不懂,我会会解释,我现在只是把它的意义说出来,它是用来存储存的啊已经。
10:08
处理过的。对象或者病的这个名字,就把说这个这个这个名字所对应的那个对象或者那个病,我们已经spring已经处理过了,那么什么叫处理过,你不用关心,后面我们会解释啊,总之他就是这个集合存在这个地方,那么他目前来讲它是什么样呢?为空的,因为这里面什么都没有好,然后代码接着往下执行,他自己做了一个判断,他说if,这个并bay啊,把instance of, 这个并differenting,那么这个判断的话,在绝大部分情况下,98%的情况,99的情况下他都成立的,因为我们这个传过来这个什么conable并in并factory对象,他就是我们这个呃,Default类并factor的对象,那么这个至于是原因是什么的话,如果你听过以前的课的话,应该就知道,就是我们是不是容器实例化的时候的话,他会去在他的复类方法当中注入这么一个,也不是注入版,就是给定这么一个的,就实分源码当中自己内置了,就自己去实例化的这么一个default disable, 并给到我们的容器对象,就是我们的application connect对象,所以就是他,那么他的话,他最终是怎么样呢?呃,实现我们这个并defs的,所以说这个你传过来这个并impact的话,就是他应该是这个90%,九十九十成立的啊。
11:12
呃,算了吧,我这里也解释一下吧,就是为什么它是一个并,我们可以看到了,如果说你是以这种方式去实例化spring容器的话,那么在实例化的时候,它会调用它的复类方法,比是调用这个什么generation application contact, 那么generation application contact当中的话,他有构造方法,那么就会去执行,对不对?那么执行的时候的话,他会去spring源码当中,就起码他自己用了一个default,类似并impact,也就是说我们整个这个application contact对象,它里面的这个呃,并factory对象的话,就是这个default Dis be factory, 呃,前提是你是以这种形式去实例化思维容器的。我们大家都知道十分容器的实例化方式有很多种,当然你可以用这个什么xm class, 比如class pass的PH啊,Class pass xml啊,就这种方法去实例化设别容器,那么它里面那个并里就不一定是这个defult be, 呃,当然也差不多啊,能理解吗?就是说我们现在做spring开发的话,基本上呃都用的是这个容器对象就是application application application对象对不对?那么它里面那个呃并factory的话就是default,类似able并factor,这个一定要明白啊,好了,我们接着来啊,那么回到这个in为和平发post process当中,呃,所以说这个我们的除非你将来有一天你实例化的十分容器的话,是特别复杂的,根本就不是这个十分容器,或者你自己呃去对十分容器进行了扩展之后实力号出来的,那么这个条件判断可能不会成功,所以我们目前来讲的话,我们就100%认为它是一定会进入这个if当中,进入这个if当中的话,那么它首先进行了一个强转,因为我们刚才说过这个并发就是实现了这个结果,强转了之后的话,然后这里面又定义出来一个变量叫做什么叫做re post process啊,那么这个东西。
12:43
其是干嘛的,嗯,我们也把它给画出来,画图我先暂停一下。呃,好了,那么这个就是我们,呃,我们画出来的这个RI possible啊,那么它里面存的是一个对象,给他写一下吧。它是一个object啊。或者我们写个并吧,嗯,这样简单一点。
13:03
呃,其实他应该存的是一个并befect possible, 这是为什么我们不去写了,因为这个befe possible, 这是这个名字太长了。怎么图影响不好看,那么它存的是什么呢?他存的就是什么样呢?呃,所有实现的并factor possible的bin啊存储。呃,这个的话呢,他应该是,嗯。这里要说清楚所有直接实现的啊。啊,所谓的直接实现,它就不是间接实现的啊,什么意思?就比如说我们这个C,你说这个C它有没有实现这个并possible的接口,它肯定实现的,因为它实现的这个并definitely possible, 而他呢又继承了它,所以这个C呢,它也是实现了这个并possible的,但是呢,它不是直接实现,所以说我们这个里面呢,它就不会存,那么这个接口,这个历史的将来存的就是所有所有直接实现了的,那么像这种A啊,啊这种啊什么1呀,这种就是直接实现,你看到没有,它就会往里面存,那么怎么存,我们先不用关心,我们先把这个呃变量给它画出来,他们肯定有意义,后面啊,那么接着来看代码啊,它定义的这么一个变量,那么这个变量定义出来肯定也是默认什么都没有,就是空嘛,里面什么都没有,好代码加的往下去,这个时候他又定义了一个变量,就是我们的什么叫做registering process啊,那么这个我们也给它画出来啊。
14:18
啊,那么这个画出来了,它就呃,它里面存的是所有直,所有直直接实现了并different process process的,那么这个我们就不再解释了,就是就是此类嘛,好吧,那么他们两个都存的是对象,你看到没有啊,就是要求的是这种类型的对象,所以说他这个呃里面现在两个都是空,因为刚刚实体化出来嘛,好接下来它进行了一个for循环,For循环水呢for循环这个并better port出这是也就是它啊把他们进行一个循环,那么拿出来是不是有两个,一个B,一个C,好,我们这里面写个注释啊,一个是B,一个是C,对不对,B的话它是负类,C的话它是子类啊,这个能理解啊,呃,那么按照名字顺序的话,他应该写到的是B,然后对B进行判断,判断它是不是一个be possible, 那么B是不是像B,不是啊,因为B它是直接实现的,指负类的,所以它并不是一个,呃,这个be possible process, 那么这个if不会成立,不过前立的话进入else else当中的话就是什么呢?RI的possibleper,就是把它放到这个什么样呢?呃,RI当中去,那么所以说它会把这个B呢?呃,存到这个当中来,Controlr c就会。
15:19
存到我们这个RI当中来啊,那么这个时候他就有了一个呃呃呃这么一个呃元素了啊,它存完之后,接下来下一次循环,下一次循环就拿到了我们的CC的话呢,就上来进行判断,他说C是不是属于这个并different接possible,那么这个C是肯定是我们可以看一眼,C是直接实现的指令,对吧?好,那么C如果是的话,那么他将C的进行一个强转,为什么要强转呢?因为以前这个list当中它存的它是以负类形式存的,你看到没有呢?我们可以看到这里面放的是b factor possible的C代码,那么C的话,他肯定是呃也是一个负类,对不对,就是他能够去转型嘛,所以说他呃要去呃执行的时候,他肯定把它强转回来,呃呃,回强转回来之后的话,那么接下来就调用什么呢?就回调啊,这个地方就是回调。
16:04
好,这个方法回调他的这个post system的方法,那么这个能不能回调的,肯定可以回调,因为C它本身就是个对象,我们前面说了,你要回调的前提它就是个对象,那么C呢,它是由我们自己实例化的时候的话,就自己把它实例化之后放到这个地程当中,所以C是直接实例化了之后的啊,那么它就能够回调,回调完了,那么就执行完了,执行完了之后的话,他就再把它放到了这个什么registerity possible当中去,那么这个C的话就会放到这个里面,Registerity possible啊,这个不是RI啊这里面呃。刚刚不那个啊,没有改过来,他应该是re点了他啊对吧,好,那么这个当中呢,C呢,就到这到到到这里就那个了啊,那么C放到这个里面的时候,我们这里面要给他写一个注释,写一个嗯嗯笔记吧,记住一下,那么C它其实放进来了之后的话,我们这里面一定要注意一个点它是怎么样,已经就是进到这个里面之后的话,我们这个C它是已经怎么样呢执行。
17:01
完了,他的一个什么样子类方法,好这样子啊,这个我们刚刚通过源码已经看到了,所以说就嗯毋庸置疑。然后至此我们这个呃,复循环就结束了,那么下一次复循环就没有了,对不对,好,这个复循环结束之后的话,那么代码接着往下执行,我们看一下这个if服的话,这个大块还在里面没有啊,我们大这个风险完执行完了,那么接下来执行下面代码,好到此为止,我们就可以看到了,至少可以理解了,就是为什么我们的这个,我们刚刚那个现象还记不记得,就是这里面说的这个CSPP,这是为什么第一个啊,就是因为是不是源码当中,他说一开始上来这是什么便利的这个呃呃通过API,呃,存储的那个list史,就通过API注册放到存储的那个list史,它首先上来就便利它,便利它之后的话,从里面拿出来所有的这些对象,判断它是不是一个什么样的been possible, 如果是的话就直接回掉了,所以说我们从整个这个方法的一个呃。呃,源码可以知道,就是spring的原则是首先执行通过API注册的那种,直接实现了子类的。
18:06
对象的子类方法啊,这个是这样子,那么他为什么要这么做,大家先不用关心,我们先把这个问题留着,我们把这个方法讲完再说,总之从这个地方我们可以呃解释的第一种,为什么C是最先执行的,就是这个意思,好了,那么我们这个录屏告一段落,这里面解释这个API调用的啊。
我来说两句