00:01
其实要解释这个问题的话,怎么讲呢?其实也需要你对spring整个这个呃呃呃框架,或者对他的这个扩展点有一定的一个认知,你就能想到,不然你是很难想到的啊,我跟大家来说一下,为什么他要这么做啊。因为还是解释一下这个be factory, 我们现在这就你要明白整个现在spring他在干什么事情,他是来执行这个be factory possible实它是用来。那我们去执行bely possible system bely possible, 他能干嘛呢?我们前面已经解释过无数遍了,他能够对我们的容器做一些个性化的配置,好各位同学注意看,那么假设我这个P,我的把这个P拿出来,为什么P我们可以直接实际化成为一个对象来了,因为P呢,它的要求,它的顺序是最就是呃,我们不就在这三个而言啊,我们不考虑前面的,不考虑这些东西,不考虑什么API调用的,我们只考虑他们三者之间的排序,就是实现了p order, 实现了order和没有实现了这两个接口的这三种类型的,呃,并这三种类型考虑的话,P order的优先级是最高的,对不对?
01:05
所以呢,Spring会直接把它实例化,因为他可能不会发生任何改变就把它去执行的,那么其他两个为什么先要放字符串呢?很简单,因为有可能在我执行这个po的时候,就比如我执行这个H的时候,这个H是不是一个po的对不对?我在执行这个时候的话,我可能会去做一些修改,比如说我改了什么事情呢,我把这个病发这样子,我给他改一下,点我get一个什么,并带回来get到谁了,我们这里的A,把A拿出来点V啊。然后我对A呢,啊,不是的啊。你对不对,是好强转一下,那我对A呢,对它的作用欲,或者对他的一些东西呢,做了一些改变。比如说a.setscope啊来给它改成什么呢?PRO type PRO.Toy p PRO to type toy p啊,我这里只是做了一个呃例子啊,实际当中不可能有人这么做,对不对,我只是告诉你说存在这种可能性,我如果把A的作用改成圆形的,你看他能不能生效,但是如果说啊斯SP的作者他是他不去这么去搞的话,他直接就是什么呢?一跟他一样的做法,就是我找完po的之后,把它放到这个地址当中,然后我开始来找什么啦,找那个叫做呃呃呃这种没有实现任何接口,找他我也把它溜出来get成B方法。
02:28
那么就会破坏这个H它本身的一些呃问题为什么呢?那我这个H放到里面,我现在还没有执行对不对,然后呢,你下面呢,如果你也一样的写法,这里呢,就是实把这个代码复制下来,对对去,一开始就是实际化这个A,把这个A实际化,那么A就是际化放到里面来了,好将来有一天当我去执行这个po的时候,执行这个呃H的时候的话,我又把H的A,那这个作用于改成了PRO type, 它有没有生效呢?它就没有生效,为什么,因为A就在这个地方呢。他已经被实例化的,按照当地的模式把它给实例化出来了,已经。
03:03
这是不靠谱的,那你那你在这个里面对那你这个H执行的方式写的代码数没有意义,比如说我把A的这个什么class给改了,如我不要A了,这个A我可能就有点有点问题,对不对,把它改成什么什么什么随么这这J那么讲道理,这个A是不能被实体化的,因为我通过我们讲过这种B白,它就是用来修改的吧,就是很多有扩展,比如买白就是这么做的,MY里面有个非常经典的一个东西,就是他通过这种呃并possible去改变了某一个东西啊,然后导致他这个my balance做的比较的呃优秀啊,那么假设我就有这么个代码,好,那么你一开始就把这个A给实际画出来,那我这个H去执行的时候,这样代码不是没有意义的吗?你在这个地方去执行的H对不对,这个H把这个A呢,可以改成了Z,那实际当中A呢,一开始的这个地方去实例化完了已经,那这个H这个代码是没有任何意义的,懂我意思吧,所以说它一开始不能被实例化的原因也非常简单,就是因为他不能被实际化在这个地方,因为有可能因为我们因为我们的最高优先级的这个P2的这个代码没有执行完,因为他可能执行这个。
04:04
这个代码的过程当中,会对我们这些将来要实例化的这个A和1的话,进行一些发生一些改变,或者去修改它的变,如果你在他没有执行之前,只是把它找出来之后的话,就把它给实际搞出来的,那么会导致我们在这个地方提供了这个呃呃呃呃呃,这个po的这个对象的一些什么样呢,行为呢,就不再有有效了,就失效了,所以是这个原理。你看spring做的考虑的多全对不对啊,当然你们可能觉得他多余,对,如果你写过大,看过大部分的一些spring的优秀的一些扩展的话,你就会知道,如果他不这么考虑的话,其实很多问题的话,就不为什么spring这个框架可以经久不衰,对不对?从我做开发以来吧,我他现在做开发也有,就是从我入行到现在,我应该也有个十十十三四年了吧,就是我开始的那个时候就spring就开始在流行了,为什么他可以经久不衰,就人家考虑的问题比我们细致的多,好就这个原因啊,然后我再给大家解释一下来,为什么上面的是spring的方法他要找三遍,对不对,你仔细体会一下,这个问题也是个问题啊,就是上面我们在执行指令的时候的话,他找第一遍来啊,这是第一遍找出来,这样子找对不对。
05:08
找完第一遍之后还要找第二遍,对不对?好,找完第一遍之后还要找第三遍,甚至还要找找找找第4遍,第5遍,第6遍都有可能,他为什么找这么多遍,而我们的执行负类的时候的话,他不需要找这么多遍的,他一遍就给你找出来的的原因是为什么呢?他为什么不像上面这样子啊,其实很简单,各位同学注意看看,因为这就是这个类的背后的意义啊,叫be possible是这个be definitely possible就施它为什么去扩展了这个be possible是。哦,大家看一眼好吧,也就是说你看一下。就这个类它是扩展了并factory的,那么它扩展的扩展到哪个地方呢?我们可以对它两个方法进行分析的,这个方法它传了一个并factory过来,也就说我们传过来这个be factory的话,只是传一个工厂给你。那它扩展的时候呢,它传来一个叫b defin jeson, 你看这个顾名思义对不对,他是干嘛,他能够注册b defin, 好,也就是说我们可以呃先呃就是从呃大范围的理解,就是从一个大局观去了解的话,这个类对这个类的扩展仅仅是扩展啊,他能够去动态注册并defin,如果你不理解说一千道1万,就是如果说你是实现这个负类,你是没有办法去往我们的并def map当中去添加并defin。
06:25
也是说1000~1万,比如说你这个A的,你这个A是不是扩展的是负类的了,你去对这个A呢,拿到它这比如说你写了一个A,其C的这个接口对不对,你这个A是没有办法去动态添加bin的,你无法动态添加,你比如说你去对B没有看到没有,它只能添加对象,不能添加bin。没有这个API,但是我们的C你如果直接去扩展到子类的,它是可以的,来我们我们已经看过了,你看F就可以了,你看F就去扩展子类的,我们可以通过这个去动态注册一个并,那也就是说一下到底它为什么这里面不要重复去找了,因为前为什么前面要重复去找了,因为前面是每当执行一遍它本身的时候,它有可能会添在新的变变,而添加到新的变,你又没有办法控制它类型,它有可能添加的就是本类型的,所以你还要再找一遍,好当你找一遍找到之后有的话对不对,那么他又有可能执行,又有可能添加自己添加这种子类的吗?所以又要找,要重复一找到没有的为止,这个能理解吗?因为这个类比较特殊,他能够添加一些病点粉,如果他刚好添加就是这种纸类类型的,那你是不是要不断的去找,但是下面的为什么不要呢?因为下面的啊。
07:33
他没有办法多到添加。你因为上面的最最上面对不对,一开始我们就完成了扫描,他是在哪里完成扫描的,在第一遍执行内置的时候,在这个地方已经完成了扫描,那如果说你有病发时,比如你这些A啊,还有这些什么什么什么一呀,对不对,这些类对不对,你一开始提供的时候,斯不就帮你扫描出来了,就算你动态添加了一些,那也不是在这里动态添加,他也是在至少是在这行代码之前动态添加的。
08:01
在这行代码之前的,只有在这行代码之前,他才可能会往这个逻辑当中动态添加一些B。这个方行完了之后的话,绝大部分情况下,你是很难再往这个容当中添加新的,因为下面代码来执行并factory possible, 我们刚才已经解释过,它是传了一个并factory过来,这个并factor是没有办法往容当中添加新的并,那么所一些到1万,其实到此为止,对不对?我们直接从这个容期当中去找到所有的B,它是不存在变数的,就是你这么一找,找出来5个,那就只能是5个,不可能存在第6个了,也不是不可能的,这个不能说太绝对啊,但是你想一下,如果前面我在这里面找出来3个,那么会不会存在4个呢?会,为什么?因为我们前面讲过,你找出来之后的话,找出来有三个对不对?其实有一个去执行的时候,他又动态添加了一个,那是不是变成了4个了吗?整个里面好变成了4个之后,他又要去找,对不对啊,比如说找好又是找找到这4个,那么这4个就是你刚刚添加了这一个,他有可能又添加新的,所以这里面要一直找,一直找一直找,但是并发post说他不需要,你只需要找。
09:08
小一遍它是不会变的,这个里面,所以它这两个写法是有一点点的一个区别的,你要好好看一下好吧,啊,那么到此为止,你看这个代码我们逐行都讲完了,讲到这个地方来了啊,这这这这里面就是这副类怎么执行的好,那么这个地方呢,我给大家留个疑问,这个我下次更新,基于这个类这么牛逼对不对,你可以思考个问题,这个你基于我们前面讲的这么多,我给大家总结,你有没有发觉是不论假设他要完成扫描,因为我们来看一下扫描的本质,就是你是扫描的本质就是把一些怎么样呢类变成并def defense, 把它放到这个b def map当中来,也就是这个这个步骤来放到这个b def map来,那么你有没有发觉s spring论也好,比如说你去扩展你的扫描,就比如说买白它是不是也有扫描那个map斯SC这个注解,还有没有同学有印象呢?比如说这个map斯SC这个注解的啊,Map斯SC那个注注解他是不是也可以完全扫描,你可以提供报名对不对?好你有没有发觉这些扫描它的动作一定要在这行代码之前的。
10:08
这行代码,呃,在哪里,这行代码。刚刚找的是在这行代码,也就是说一定要在这行代码之前,你的扫描才会有意义,你才会放到b map当中,对不对,你到了后面的话,其实你没有办法往这个BDF添加了,所以说你像买balance一样,他去扩展他的扫描器啊,包括我们的一些,呃呃,其他的一些,比如说你自己对不对,你将来在公司里面,你要有一个什么art,他他的这么一个,呃,我们现在是art comp的对不对啊,比如说你的公司里面,你可能要写一个art叉叉叉的这么一个注解,也能够作为一个病,对不对,比如说art叉叉叉叉,那么你可以自己去写一个扫描器扫描这种注解的,那么你写的扫描器你要扩展到类对不对,一定要扩展它来扩展这个并post process, 而不能扩展post process, 因为你扩展并post process spring的执行时已经决定了。不能再往这个map里面去放了啊,你放了也没有意义了啊,还有一个还或者你就扩展这个类之前的,其实在这个类这个并def possible, 它还有一些类是不认证,还有一些类比他的职时间还早,那么你可以扩展那些,那也可以完身扫描,你像买白子他扩展的就是这个并def re possible system来我们可以看一眼,我就记得我上次给大家看过,好吧,你看stands after map, 它里面就导入了一个类,让这个类去执行的,就是这个类的叫做呃,在这个地方导入的来叫做map sc con来,你看它是不是实现了,它在他的子类方法里面,它就完成了扫描。
11:28
I got同学看。在哪里呢?我们找到他的指类方法啊,是不是这个呢?Post随变是不是他的指类方法,在他的指类方法里面完成了扫描啊,就是他的一个扫描,起码spring的啊,不是买白的,所以说买balance的那些扫描出来的那些被就是你那些到啊我们买白不是很多map吗?他扫描他是在哪个地方被扫描出来的啊,从spring的角度而言的话,他必然是在这个这行代码之前,至于在哪个地方啊,不重要,就要看你的这个是哪种类型,比如说你实现的po的,那就可能是在这行代码对不对啊,这个我们讲过嘛,就是判断他是不是实现po的结果嘛,如果你实现了po的话,那么可能在这样,那么也就是在这里就去执行了,我们刚刚那个买BI这个扩展点,他就把它的扫描器,把它类给扫描出来了。
12:10
好,大概是这个意思,所以说这个方法真的特别特别重要,我们已经逐行把它讲完了啊,当然如果你单看这个方法确实没有什么很大意义,你就看懂了这个方法而已,但是如果你结合spring的一些其他的一些,比如些一些扩展点,一些主流框架的去看的话,那这个方法变得尤为重要。那么我后面会跟大家讲一下关于说买底层扩展的一些原理啊,跟这个东西是怎么关联上的啊,我后面再来录,还有最后一行代码这个什么并fact一点,Clean定mad date catch这个方法的话,你别看这一行代码啊,这行代码如果要讲的话,至少要讲一个半小时,那么我将来有机会再去更新吧,我们这节课我说主要是把这个e work和并back post process测试它的一些表象代码,给他讲完,也也也而且呢,我也呃讲了很多,就是这个代码的设计的原则,就为什么是不是要这么设计,对不对,就是这个顺序,他是为什么是这样子的,我也讲了对不对啊,就是每个人就怎么考虑的,比如为什么是C啦,因为我说过啊,上来你是API提供的最简单对不对,我就给你拿出来,然后为什么要是内置的呢?因为内置的话是spring要去做一些事情,他要去完全扫描,你不可能说执行这。
13:11
这些执行不了,因为这个时候还没有他们一定要先执行实名类置他们那扫描这扫到他们才能执行他们,然后呢,为什么执行的是I呢?因为I的话是什不能规定的,他就为了怎么防止说你有东西你要提早执行对不对,你可以实现某个接口,就是让他去,呃呃呃,就是有些特殊功能,你要很早的执行,比如说你这个I这个比D要执先执行,那就用这种po的接口来实现好了,那么剩下的就是一些普通的就是通过排名排序的啊,然后为什么这个是后面的,因为我们说过你这个子类的话,肯定要的时机要比我们的类早,对不?因为他是对他进行扩展嘛,他的时机要比较早,所以说呢,子类的它实类的原则是优先执行子类的,子类方法,当子类的子类的方法执行完了之后的话,那么再执行它子类的负类方法对不对,后面才是我们直接实现了负类,就是灰色这一块的负类方法,所以它是一个大体的原则是这样子,好把这个记住,然后的话,我希望就是你看完这节课之后话,你把这幅图拿过去之后的话,你对这个图也能跟我一样,把这个顺序给它总总结出来,那么你将来再去看到一些扩展点,你就知道,闭着眼就能知道,诶这个代码它是什么时候执行的,就比如说你看到一个类,比如我们刚才看到这个map,十干十工一个扫描器,买白这个扫描器对不对,你一看就知道它大。
14:11
大概是在这个地方执行的,那么在哪一行代码的话啊,这个你可以具体分析一下,然后就知道它的顺序是怎样子啊,你就对对对整个这个执行实际是有非常直观的了解的啊,所以说相当重要,好吧,那么我就跟大家分享到这个地方,呃,下个视频的话,我跟大家分享一下我这一两年在干嘛吧,好吧,因为这一两年的话,其实在家里也一直在呃呃混日子好吧,嗯。
我来说两句