00:00
好,那我们接着来啊,那我们代码的话,同样让他大概让他执行到这个地方来,因为前面代码我们已经分析过了哈,让他走到这个地方来啊,那么的话就是我们刚刚是不是看完了这个肯定了之后,对不对,把我们的这些map给它给找出来了,也就是变成了这个样子之后的话,呃,我们接着来,那么接着来之后的话,我先要再来解释一下这个ity post当中,那么合并的时候啊,没有执行,那么当我们的什么CCPP对不对,呃,这个地方我们就不再说了,反正解释一下合并的时候没有执行什么,呃呃呃呃,就后面呃,还是执行环。承认指挥方法的啊。淘避还是执行完了,也就是说这个里面现在有两个,一个C,一个CCPP,我们现在再来对他进行一个验证,我再来解释一下这个东西它是干嘛的啊,你看这个逻辑是两个啊,他这个里面是为了干嘛的呢?首先他的目的是存储所有直接实现的并possible病。那么他为什么要存储呢?他为什么把它存起来呢?有的同学是为了执行,为了执行的话,他其实可以放到这个里面,对不对卡当中去执行的,他已经执行完了,这为什么还要定义这么一个东西呢?我们来看前面的来。
01:08
他其实没有必要,这个变量现在没有看不出它的意义,你看呢,在这个地方的话,有的同学说啊这个啊,它定义的是在这里对不对,你为什么把它存起来,就执行完了之后,为什么还要把它存起来呢。你把这样代码注释也不影响啊,就比如说你这个地方有三个通过,因为这个里面是首先是便利通过API提供的,也就是这个历史对不对,便利它假设这个里面提供了有三个都是子类的,那么你在这里做for循环的时候,你就执行嘛,对不对,那你在这里面做for循环,那找到这三个一个一个执行嘛,你为什么执行完了之后还要把它存起来呢?以及下面的这个东西,你下面的当当当前这个批次的这个current来在这里来current当前这一批次执行完了之后的话,为什么还要把它进行一个合并呢?就是在这个地方要合并,你看你他合并之后有没有把这个传过去,对不对,他传的还是当前的,这里好好体会一下,也就是说这个变量我们现在看不出它有什么意义。
02:01
如果SP要去执行当前批次,他就有这个current的process process就可以了。但是呢,他在执行之前先把它进行合并,就是把我们找出来再放到这个里面去,然后传的时候并没有传它,传的是它对不对,那为什么他要又在定义这个变量啊,它的目的是为了存储,所有就实现了这个东西,那么存储之后的目的是什么东西啊,为了。执行负类报道。好,我这样说大家能不能理解啊,好好体会一下,我给大家解释一下,就为什么是这样子,因为你看这个绿色的呢。你要知道所有绿色的这些类,它都是实现了子类的,那么一个类如果实现了子类,比如这个C,它是有两个方法需要毁掉的,一个是子类的方法,还有一个呢,是这个方法,这个方法是负类的方法,看到没有呢?呃,Post process并better,对不对,它是负类的方法,那么子类跟负类的方法不可能同时执行,不可能说我一个类我执行的子类方法之后,根本就执行负类方法,肯定是不是这样子的,你懂我意思吧,是分类的原则是我先找到C,把子类方法执行完了,如果还有跟我同等级的,比如说这个呃,D, 那么我也把D的子类方法执行完了,就先把子类方法执行完了。
03:18
然后再来执行负类方法,他们不是说一个类当中的子类方法执行完了去执行负类的,而是说把所有的同类型的子类的子类方法执行完了,再来执行同类的所有的负类方法,他是这么一个原则,这里面能理解吗?那么他如果没有这个历史的变量的话,他怎么找他们呢?你比如说前面的我们这个,这里面就是我们这个C嘛,对不对,一上来就是把我们这个B,他B的话就放到这个里面来了,对不对,只有这个C会存到这个里面,呃,就C去执行完了,执行完了之后的话,它仅仅是执行的C的子类方法,C的负类方法还没有执行啊,那么将来如果我我有一天我要找这个C,怎么找呢?所以他要把它存起来放到这个里面来,好,我们再来看当前的它也是一样,就是这个current好,我们这里面去找,呃,找10不是内置的,找出来是不是内置的有一个有一个的话,那么我要去执行的,比如我这地方是不是要去执行啊,我要去执行之前,我先把它合并,先把它放到这里面来是吧。
04:15
保证我下次还能够从这个里面把我拿下去,执行我的负类方法,所以这个就是为了执行负类方法的一个目的。这个变量不知道有没有解释清楚,好好体会一下好吧,呃,就关于说这个变量,嗯,好了,这个变量解释完了之后的话,那么我们就来看看这个啊,那么呢,这个时候我们已经把什么内置的执行完了,也就是我们这个图上可以从这里看到CSPP是不是这个意思,对不对,CSSSP啊,然后CCPP的SSSP,那么就已经执行完了,那接下来他看他怎么做,你还有这里面还有好多啊,比如说我们这里面还有这些什么啊,这个执行完了,这个执行完了,我们说的是子类方法啊,这个这个这个这个还没有执行,那10分怎么办呢?来看它啊bfactor.getfor,它同样再次去找。那么这个时候再找的话,刚刚他是从这个里面去找的,从这个红色里面去找,找到只有一刻,那么这个时候他又重复来一遍,再去找一下,那这个时候找的是什么整,又是从这个这个里面去找,那么一找出来有几个呢?来我们来数一下,这里面有一个对不对,你看嘛,他没有排除对不对,他本身就没有排除,他还是从这个b.map里面去找,找出来这个里面有一个,就是我们的CCTP两个,三个,他应该会找出来四个,也就是我们这里面写的注射啊,那么的话呢,这个当中的话,它应该是有几个了,我们这里面。
05:29
也就是写在这个地方啊,我把它停掉吧,好吧,等一下再来吧,来。也就是说。第二次找他可能会找出来,就第二次找可能会找出什么,因为第一次扫描,然后找出来新的这些,并difference post process, 对不对?那能找出来新的有哪些呢?我们来说一下,CCPP肯定存在,因为第一次找就找出来DS肯定也能找到,第二个的话就是我们看图直接d fid Fi啊好了。逗号,隔开一下吧,我们来看一下是不是啊,直接跑。
06:00
看是不是找出来d Fi.呃,就是这个代码对不对?好了,我们来看啊,往下走看它是不是4个啊,来4个CC p pd Fi没有问题吧,好把这4个找出来,周的话,那么要执行他们嘛,然后呢,往下走啊,来看代码,呃,我先不调试候,我们先看代码,好吧,我们等一下再来调试,就阅读和调试候把它分开啊,我们先静态读代码,就是大家,呃呃,有很多同学问我一些学十分源码的一些技巧对不对,我觉得学习分源码的一个技巧的话,其实没有多大技巧,呃,你一定要掌握一个叫做什么静态读代码,有很多同学就喜欢去调试去读代码,我觉得调试读代码的话,会对你前期,除非你的水平已经非常好了,你就可以去调试,就前期你如果对实源码没有那么认知的话,就说或者任何源码没有这么呃强的认知的话,我建议大家先静态读代码,可能会比较的烦,比较的郁闷。但是你先去读,就是你先有一个静态读源码的一个过程,然后再去调试的话,会加深你的印象,并且对你,并且会对你,呃,就是对作者的一些想法和一些思维,他写这个代码的意义的话,会有更深的理解。
07:04
如果你什么东西一上来就是debug去调试的话,那你可能就是呃,把它看懂了啊,怎么怎么样,但是的话要成为这个,比如说能够去讲出来,就像我一样去讲出来的话,可能会比较的麻烦啊。这里我花多一点时间解释一下,就是说很多同学可能会干,就是我,我比如说工作当中,我去学习一个double,或学习一个新的一个技术的一个源码,那我也像你这样做静态图代码嘛,啊,这个不一样,这个看需求,就如果你仅仅是为了解决某个问题对不对,想去呃呃看一下这个源码的话,那你就用第B个去看比较合适,但是如果你是冲着一个学习的目的啊,就如果你对我比较了解的话,经常听我的课的话,其实我一直在强调一个东西,就是我们学习的话,不应该去抱着一个非常强烈的目的,比如我也年薪百万,我要怎么怎么样,那这种目的是我觉得是不应该的啊,就是你学习的话应该是一个纯粹的目的啊,包括我以前我在网上录了过一个就是spring的合集的视频,但是录的不是很好,就大概有50个小时的一个视频里面,我一直在强调,就是我们去学习这个东西的话,你首先不要抱很强大的目的啊,我要面试,我要年薪百万,我要怎么怎么样,我觉得学习它是一个纯粹的事情啊,就是说你像你大学里面你去学Java的话,你那个时候你是不抱任何目的的,对不对啊。
08:07
就是特别纯粹的一个这么一个东西,像这个时候你去学习的话,我建议大家去这种静态读代码啊,不要太浮躁了啊,嗯,好了,这个我留到这个课程视频讲完之后,就最后一个视频跟大家来分享一下,就是我这一两年的一个关于说学习Java的一个感触吧,好吧,啊,先不聊了啊,那么静态的代码我们还是那么这里面拿出来4个。D Fi, 你看它怎么办的啊,好进行再次进行一个变历便利之后的话,你看这里面这个就起到作用了啊,他首先判断,你拿出来这个变量,拿出来这个名字,再不在我们这个集合当中,这是不是一个集合,一个set集合嘛,在不在这个集合当中啊,如果在的话,也是这个地方返回的这个true加了个不就是force,那么后面这个就不用看了,那么整个这个if就怎么样呢?不会进了,那么就进行下一个循环了,所以说它是为了防止重复执行。这里面看懂了吗?因为我刚刚不是说了吗,他又会重新找一遍,对不对,因为我们前面解释过,是不是要把这些全部执行完,他是有依赖关系的,他是要执行它,当他找出来之后的话,那么他呢去执行,把他们给找,找出来了,那么spring呢又要去找,那么他就会把他们全部找出来,那么这个已经执行完了,不需要执行了,所以说他要把它什么放到这个变量当中。
09:19
这个里面,所以这个要处理已经处理,哎,存储已经处理过的病的名字,现在懂了什么意思,就是为了防止重复执行。重复执行。好,这个不知道同学们能不能理解了啊,应该没有问题,看这个圆满应该可以看出来对不对,好了,不再说了,那么的话大家接着往下执行。这个过了,它不会进入这个if服当中,然后第二个循环拿到我们的DD进行一个判断,他说是不是在这个里面,D不在这个里面,所以这里面返回的是true,因为就加了一个不嘛,首先这个结果返回的是force,加了个不就是true嘛,那么这个呃,断路就会接着往下后面去走嘛,这个且伏就是接着往后面走,然后再判断D是不是实现了这个all的接口,那么D有没有实现呢?没有实现,我们来看一下D2。
10:03
D是没有实现order接口的啊,好,D不存在,那么接下来我们来走什么呢?走我们的FF肯定也不是,我们来看一下FF它也是不是这个呃,这个接口的,我们这个时候再来看ii是不是这个实现的order接口的呢?I实现了,为什么呢?因为I呢,它实现这个po的,Po的是不是实现了I接口,对不对,实现这个就所以I的话就会怎么样呢,被找到,那么这里面就把I添加到这个current list当中去,也就是说这一步的话,就会把这个这个I呢放到里面去,其他的不会啊,你们这里就多了一个I,所以说我们这个里面的话给它写一下。这个看的意识当中的话,这一步的话呢。它里面就有一个II对象啊呃,通过了get b把I实例化,这个我们下面产品上面已经讲过了,不再讲了,把I实例化啊,其实我们可以在可以在I这里面去给他怎么样做一个。Public I的一个构造方法。抛开抛球,抛开抛球,然后的话,Logo点第8个了引号,引号就是create。哎,等一下我们可以看日志,那么他会打印这个I已经被创建了,呃,需要说明的是这行代码之前。
11:08
代码之前啊I了,不存在单例值啊,这个本来我们要在上课讲那个里面就可以,呃,这里我们也可以演示一下,它不存在单例词当中,好之后呢,这行代码之后存在单列词当中。好,那么这个单例子就是我们上面说的这个single object是当中这个这个变量啊,它是在我们整个四分容器当中,这个application容器当中,这个b factor, 这个呃,工厂里面的一个属性,一个map属性,所以它是它啊好了,我们等一下也可以验证一下,嗯。好,如果说找出来之后,把它实力过之后的话,接下来就要执行它,执行它之前的话,同样先把它放到这个里面,就表示这个I来已经怎么样处理过了,所谓的处理就是已经啊找出来了啊,这样就房子怎么样呢。呃,重复执行是吧,好,然后代码接着往下走进行排序,那么这里面只有一个I也就不排序了啊好,然后的话就把它怎么样呢?呃,这个呃放到这个里面去,放到这里面我们也写个注释,这是为了什么执行I的负类方法。
12:10
那么也就是说这个里面会账号代码执行方的证明有三个,一个是。哪三个呢?就是一个是CCPP。还有一个就是我们前面执行过那个一开始是C对不对,好还有一个CCPP,最后呢,现在这里面多了一个I啊这个样子啊。大小吧C吧。好,然后的话in work, 那么至此的话,我们就执行了I,执行什么I的子类方法的回调。嗯,好,然后再把它给清除啊,然后这个代码呢,我们来再来把这个图给它完善啊,那么首先按照我们刚刚说的话呢,那么这个里面的应该会多了一个什么样呢?已经是处理完了,就多了一个什么I嘛,引号引号对不对啊,还记不记得我们这里说了,就会把这个里面放进去嘛,防止重复之行,把这个I放你数里面会多了一个I,然后我们再来看这个当中,RI当中是没有的,呃,这个里面的话,这个I同样会在里面看RC看R会复制一下啊。
13:07
这个要画大一点,因为这里比较多。我就让他们靠齐吧,这样子啊。I, 嗯,他呢也会在这个里面,就呃,等一下我们调试完了之后,对不对,整个这个就变成了这样子,好放了一个I。呃,这个如果说怎么样呢。Current当中的话,刚开始是有一个I的,当他执行完了,他会肯定要把它清除掉,所以这里面会有个I,好了,大概就是长这个样子,整个所有的这些呃变量啊,接下来我们来进行一个调试,来看一下是不是啊。
我来说两句