00:00
我们来说第4种情况啊,这里面为什么单独录个屏呢,因为这个东西的话呢,我要跟大家讲一些呃,Spring的一些基本常识,估计很多同学可能会理解错的一些基本常识什么呢?就是呃病的一个实例化顺序的一个问题啊,他是跟我们病的名字有关,但是跟其他的是没有很大的关系的,那么我这里给大家写个例子,这个代码我刚开始没有写好,所以要重新去写。腾讯去写的话呢,我建个包吧,我把录屏停一下。嗯,好了,我建几个包来,我们来看一下啊,我想说的问题是什么问题呢?就是。呃呃,就是关于说spring当中的一个B的一个实例化数据,它是跟名字有关的啊,我们先来看这三个类,这里有A啊,B还有C这三个类啊,然后这个XY的话呢,我先把它注释掉吧。ABC三个类的话,就是一个最普通的类的啊,啊,你比如说这种类,你说要我去命个名对不对,是不是比较麻烦对不对,我因为ABC多简单啊,你搞个什么什么什么什么B1病啊B塞跟ABC没有什么区别的,所以说呃,就是为我用ABC命名就是这种,因为我们现在讲的是源码,就是为了去验证某些现象,而不是去真的去呃公司里面开发,你去公司里面开发的话,你建的这个类肯定是有意义的,对不对,他是针对某项业务的,那我们肯定要做到建民之义,而我们现在去讲这个代码的时候呢,很多时候是为了验证某些现象,那我们为了某个现象去,如果去取这个名字的话,那这个东西太麻烦了,比如说我这里要去验证这个B的一个顺据,可能要写什么b all的normal什么什么什么之类的,那这个没有意义,对吧,我不知道能不能理解我说的啊,就是说这我觉得ABC命名啊啊并且呢,这里确少有ABC了,那我们来跑这个代码了,这里面就是ABC,然后呢,去扫描这个b name包下面也是这个包下面这个XY,我现在把它注册就不用关心,然后呢,我们这里有个测试类,并在这个测试类一跑的话,那么他应该实例化的顺序的,我们来看这个代码呢,它里面的这个post就是不论你去实例化这个并州的回调的一个初始。
01:53
化方法对不对,所以说呢,就是他应该就是ABC打印的了,它是按照这个顺序来的,就它是根据字母顺序来的,就呃这样子,这个呃好好体会一下,它是跟其他的无关的,有同学说那是不是跟什么order有关啊,给大家来证明一下,就比如说我给这个C加一个order啊。
02:11
啊,实现一个接口,我还实现这个pretty order了,直接实现order audit啊应该叫做。啊,然后呢,重写它的一个方法,它的值越小,它的一个什么应该是顺序越高,对不对啊,我们就给他一个什么0,然后的话呢,这个呢,给他一个叫什么呢?1,那么讲道理C肯定要高一点,对不对,但是呢,他不会有任何的,呃呃,那个啊好的,那比如说我们重写它刚刚那个是0嘛,这个是1嘛,那么你讲道理的话,0应该要钱对不对,1是在后面的,但是你跑的话,它的结果是一样的,也就是说我们的A呢,是一定要大于C的啊。Class have been changed着。什么改变了什么意思啊?嗯,那我们可以看到了,ABC, 同样的是没有没有发生改变的,还有同学可能不相信,然后我把它改成这个,改成5,改成这么大对不对,好,我们再跑,那它的顺序还是最早。
03:04
你不相信你把这个C改的比5大,现在C是比5小的,不是0嘛,你把它改到大改成10,它还是没有影响的,还是ABC的,所以这个O的接口,它是跟我们并且实例化的顺序是没有任何关系的啊没有关系,很多人说,那这个我在网上看到说有有关系啊,对不对,那为什么没有关系啊啊这个第一个可能我网上说错了啊。来,我给大家解释一下,那么这个audit有什么作用呢?好,我给大家来解释一下,是这样子的。这个这个什么,这个叫什么auditor啊,它其实还有一个叫叫pretty auditor叫做叫做叫做pre,叫priority什么。Al的接口的这个接口啊,这个接口呢,它是怎么样呢?它是继承的这个al的接口的,那么在是不能底层这两个我们可以理解为一个就是它的优先级的比这个ALT更高,那么那么你刚才有讲过,你说这两个没法体现优先级啊,注意我讲的优先级它只是一个名词,我并没有讲到说B的实例化的优先级,B的实例化优先级你是很难改变的。
04:08
是不论底层,它是根据名字来的,那么有没有办法去改变它呢?也有我给大家这我给大家来写一个来,当然我们把这个地方先给它给删掉,我们说的这两个没用啊,就是并且实际过顺序你是很难改变的啊对吧,这个C给它删掉,那么什么情况下它是呃会有影响,就是让我们的C要比A早,实际或呢,在实spring当中有很多办法解决,有一个比较简单的话,就以加一个底depend是on来,这个注解是可以的,底depend是啊啊比如说引号引号这样子,引号引号给它C来你跑这个时候讲道理,C他要实体化在A之前了。啊,你可以就是c BA ABB了,所以这种方式是可以的,如果你把它删掉,它进来就不行,那么这个底DEPENDS2就是说,呃,说白了就是说我们这个A在实际化之前,它会去看你有没有底片SR,如果你有底片S2的话,那么的话他要去看一下,呃,就是说就是说白了这个这个类16化之前要去依赖这个C,所以他先把C10例化了,所以这个意思,那么A的接口,刚刚我们看到这两个接口,它是无法来决定我们B的一个实例化顺序的,那么这两个接口有什么用呢?它确实能够决定一些优先级,但是它不是决定spring病的实例化的优先级,他决定的是supreme病,一些特殊病在执行回调某些方法的一个优先级,是这个意思,不知道我这么讲能不能听懂。
05:23
呃,我这里,呃,嗯,我想个简单比方看一下,我想个简单比方啊。嗯,那所以说很多同学看文章,就比如说诶A的优先级高,B的优先级高对不对,比如说看到这个order接口的时候的话,就会就会想当然的去认为他是在实力块选,其实不是的,那我打个简单比方就好,比如说我经常呃,我经常讲课的时候,我的自我介绍,我写的是比如说我叫做什么子路,然后我的一个比如说啊啊啊就什么啊,人帅啊啊那我好对不对。啊,然后怎么怎么样,他他他后面的是一些啊这样子啊,那么很多人看到这个活好会相当难的,理解是那方面的活好,其实不是这个活好就是指的是我的怎么样呢啊编码水平对不对,就这个意思,那么我们跟着讲的这个优先级也是一样,就比如说你去看到一些文章,人家确实可能也没写错,比如说加了audit,或者加了pre a, 然后呢,把这个字改成小,他说我们这个类比这个类的优先级高。
06:14
可能是没有错,但是你理解错了,他说的不是实例化的优先级,说的是这个病,他的一些某些特殊的一些呃呃,功能的优先级,那比如说我们再给大家举个比方,你像这个X和Y,它就是一个特殊病,它是不是实现了,是不能当中某个接口来实现这个接口,X和Y实现了这么一个接口来,我让它生效啊生效把它举起来。那么他们呢,他们俩在回调这个方法的时候,他们是被具备有优先级的,那么默认的优先级的就是根据他们的在spring当中实例化的顺序来的,也就是说我们按照我们这里说的就是怎么样呢?默认的顺序,你必须搞什么其他的东西啊,就是他们俩一样的情况下,那么他是怎么样呢?它是按照名字来的,就是XY,这是最大的前提,那这是先调用X,再调用Y,那么有没有办法让这个Y的优先级高一点呢?有很多办法,你可以通过来源不同,或者说实现的这个机制不同,比如说你这里实现它的子类啊,并DEF这个东西的话,那么它可能它的优先级会高一点,当然我们这里说的是什么同一种情况,就他们俩是完全差不多的一个情况下的话,那么他们怎么改变优先级啊,就可以实现这个play order的接口了啊,我们来一个比如说O的接口,All的接口这个它啊。
07:23
瓦迪亚。它然后的话,我们让它的,呃,这个Y的话,它的一个0为0啊,因为值越低的话,它的这个优先级越高,X呢为多少呢为1。法律的结果。这样子啊,好。去1啊,那么这个时候我们可以看到应该先打印的Y啊,而不是X,现在是X对不对,XY嘛,那么你这个时候再跑的话,那么讲道理它应该是怎么样呢?啊,YX来,所以说这个就是这个,呃,这个all的接口,包括这个pretty order的接口,其实这两个没有什么区别啊,这两个这个叫做这个priorority oity的接口,这个P的,我们简单一点称之为P的,因为这个词单词练起来好拗口啊,就是。
08:06
啊,这个啊,你可以理解为这个这个P的跟我们刚才那个order他们是一样的啊,只不过呢,这个P的别个order的优先级更高,就是如果我一旦实现了p order的对不对,你你看我这里是1,虽然比我们这个Y的优先级要低,对不对,严格意义上来讲,你这个Y是0嘛,但是你执行的话,应该讲道理还是X在前。那就说白了,就是现在你能能懂吗?就是P的优先级是最高的。就这个意思啊,所以说那么我再给大家总结一下,这个order这个啊,我们统一把这个p order和这个order都称之为order啊,就是order这个接口,其实它没什么用,你发现没有,它是开发出来给spring用的,也就是spring spring这个框架,它源码当中内部会自己去解析这个p order的和这个order的接口,你程序员是没有什么用处的,当然你如果更牛逼,你会对spring扩展,你在做一些扩展的时候的话,你也可以去解析这个类,诶你发现这个类有没有实现order接口,有的话你就怎么去排序,它就是我们在外部提供是没有用的,因为这个是不是内部他自己用的,他在什么地方解析的,你不知道我这么讲,同学们能不能理解,你好比说他为什么不能决定这个病的实例化过程呢?它只能决定这种什么回调过程呢,你看这个回调过程它是能够决定的,对不对。
09:21
就是他可以按住这个就回到这个方法的过程态,他为什么不能决定病的实例化过程呢?答案非常简单,因为spring他的源码在写的时候,他的实例过程时候,他压根就没有考虑人家没有对这个order进行解析,你说他怎么买,除非你牛逼,你去把10份原本改了,这10份原本底成实例化这个病的时候的话,你去怎么样来对这个并进行一个解析,看这个类有没有实现pretty out的这个,如果实际你按照这个顺序来实例化,那就可以,但在这个10分源本底下没有做这个事情,所以说这个就没有用,讲了这么多,你好好体会一下,就是说这两个接口对不对,其实你要看spring作者他干了什么事情,他如果没有干这两个接口,就竟写的这个地方没有任何卵用。它没有解析啊,你包括我们在这个地方呢,我把它改回来啊,还是改成order的order的啊,那么我们的什么样呢?X要大怎么样呢?Y是要Y是要0,就是YX什么呢?我们再跑一下,这个时候讲的就是YX啊,它是YX啊,不是XY,因为我们把它的优先级改了嘛,对不对,但是他们的实例或顺序绝对没有改啊,你不相信我们可以试一下,比如说我在这个地方来个构造方法来,他还是买了XY的public puuc.
10:28
好,还有放弃我。好了,logo.debug, 我们就打印一个create c的好,就是一样的,把这个X也给它加上来。他的实例化顺序它是没有改变的啊,这个我刚才也解释过了,因为是spring底层没有对这个进行解析,他在实例化的就是压根就不考虑这个O的接口没。你看吧,来应该是什么东西啊,XY对不对?实例化的需求是XY,但是执行的时候呢,是YX,现在懂了吗?也就是这个O的接口,它是要在某种特定的类当中的一些特定功能,看spring底层是spring做的,他有没有对这个order接口进行一个呃呃呃呃呃呃解析,他没有解析就没有它不是一个什么样呢?放就他就这个这个东西的话,你不能去一概而的去解读它,你说他具备有些优先级吗?那不一定,他可能没有十分下来就没有考虑到他不像我们Java当中,比如说你写了各种方法一定会执行对不对,比如说你这个任何一个类,你只要写了各种方一定会执行,这是这种什么样呢?这种必然的结果,他不是必然的,它叫要他在order接口的话,很多时候是没有用的,在特定情况都有用,比如说这里有用,比如说在我们之前做,我们以后将来学的AOPP的时候的AOPP里面有个通知对不对,那个通知的顺序也可以用这个来决定,因为是不是源码底层对AOPP这个通知进行去执行的时候,他会去判断他有没有order,所以这个意思好好体会一下,那么说了这么多,也就是我们这里说的是怎么样呢?
11:48
啊,这个第4种就是前面三种都是没有实现order接口的,还有第4种情况就是这这三种情况我们刚刚讲过对不对,就是无论你是注解的API提供的,还是通过并DEMO动态提供的,他们都有可能实现接口,也有可能没有实现接口,所以我们把这个单独拎出来放到他们之上,就就是说啊,有这么几种情况啊,这些类的这个地方,然后接下来我们针对这些情况开始来建类,就是把这种情况都考虑到,然后呢再来看它的源码。
我来说两句