00:00
嗯,好了,如果我如果你理解了这个之后的话,我们再来理解一下什么是b defin, 因为我们刚刚看到我们这里面用了一行代码,就是bfactor.getbdefin啊,把这个A拿到得到了一个叫b defin, 就是abstracted b defin, 那么我们一般把这种把这种对象都称之为b defin, 为什么呢?因为Abstracted b defin, 它是最终是实现了一个叫b defin接口的bin def, 这个接口有很多实现类啊,那么spring当中呢,对于并in defin这块东西是一个非常大的一个东西,我们把所有这些子类,因为不同的bin def, 它是用来描述不同的类型的病的啊,那么把所有这些词都称之为病DEF啊,那么这个病DEF粉它有什么作用呢?简单解释一下,呃是这样子的,这里呢,我这个问题的话,如果你懂了,你就跳过,因为我经常会讲这个问题,我只不过呃讲给有的同学,可能呃不理解的同学简单听一下好吧,就是来是这样子啊,就是如果说呃我们有一个对象,Java的一个对象object,那么的话,我们Java这个对象是用通过什么来描述呢?是通过类来描述,就是你有一个类。完了之后的话,你可以描述就就能生成一个对象出来,当然了,我们我们做spring的时候的话,Spring当中有一个概念叫做病。
01:05
病这个概念呢,很多时候我们类当中的一些呃呃信息是无法描述的。你比如说它的作用欲。我给你一个类,我就光大给你一个类对不对,比如给你这个A啊,你不去看上面的这个注解啊,因为这个注解是不是类的信息的,就是类是我们的,其实你需要额外去对这个类进行一些,就是我们的JM是不会去解决这个注解对不对,你可以要你要去自己去写一些注解解析器才能去解决这个注解的,就是我刚刚给你一个类的话,给你一个A,你是无法知道这个A是原形还是它是一个单立的,你包括这个A怎么样,他要不要自动注入,你也是不知道,你光刚从上面看你是看不出来的,对吧?啊,包括这个就你怎么知道这个B是自动注入还是手动注入,你看不出来啊。啊,在这个上面啊,包括这个A当中,它的有一些什么样呢?啊,底层的是按啊,包括它是不是懒加载啊,你都是看不出来的,有的同学说懒加载,我可以再加一个什么lazy,对不对啊,这样子是不是就能看出来了,比如说给他一个true啊,TRUUE, 它一个Y6=true吧了,那这样子确实能看出来,但是你想一下,如果我这个信息都放到XM当中去了,我们对于一个B的配置是不是可以通过XML,那么我如果刚才给个A给你知道,那么它是不知道这个A的一些,呃,Spring需要的一些信息,比如说我刚刚讲过是否两加载,那是不是怎么样的单利的啊,就是呃呃呃,要不要自动注入啊,有没有依赖等等之类的,你是看不出来的。
02:22
所以说你光才给个类给spring的话,是不知道怎么实例化的来,我实例化的时候要不要自动注入呢?我实例化的时候要不要两加载了,我实例化的时候要不要注入这个B啊,他是不知道的,那么spring要的是一个什么呢?他要的一个东西叫做b defin的,这个defin是一个对象,这个b defin当中有很多属性,这些属性呢,就包含了这些类的信息,也就是说1000道1万,你可以理解为当是不是容器去扫描到这个A的时候的话。如果你是叉L的对不对?他会去怎么解析这个叉L,如果你是通过这个art component写的话,那么spring会去扫描它进行一些解析里面的注解对不对?解析这个注解的时候的话,我给大家写的伪代码好了,我们写个方法PS som啊,那么我们这里模拟spring的,当spring spring扫描到这个A的时候的话,那么这里是不是有个类CLS对不对,CLA.
03:09
JZ啊,等于空,我现在的好比说我们这个class就是我们的A,那么当时不能把这个类拿到之后的话,他会去怎么样呢?去熟计化一个对象叫做什么呢?就是Generation。叫做绿色变得粉了是吧?这里有没有?或者叫tra并defense也可以啊,反正都差不多的啊,Being defense.然后就等于。嗯,我这里还不能确定,我现在是等于空白,好这样子,因为我这个是obstract的啊,好是spring首先会实例化出来一个bin def, 然后呢,对这个并in def进行填充,比如说我这个bin def, 我要描述哪个类,我给它设载一个bin class来,当然了就是这个类class类比就说我这个A,将来有一天我这个b def这个对象,我给它叫做什么东西啊,叫做A吧,就是A啊A,那么我这个A这个对象描述的就是这个类,A这个类,那么呢,这个A这个类呢,它的一个。
04:10
作用域是什么?它是圆型的还是单立的呢?我们可以继续的给它设置,诶a.set的scope来,比如说我们从从这个可以把它解决出来吧,比如说你这个地方有一个art scope对不对,假设你写的你没有写,它有默认值对吧,但个这个大家应该都知道对不对,Spring是有默认值的,他把它拿出来放到里面来,比如说你是呃,Single的或者单立的,就随便你比,比如说你是proloto type的啊,那么就这样他就把它给存起来啊,包括这个类。它是不是要懒加载set,这是lazy az y set, 呃,Is直lazy或者set它,那么他也会把这个解析出来,那么你这里就是true的话,那就是true啊,T下UE好,包括这个类它的一个自动注入模型,比如说a.setouttoview的model啊,默认是手动注入的,那么我们刚才也看过这个A它不会注入,B就是默认它的手动注入的,那么你现在把它改成自动注入的话,他也不是改成了,就是他要读到它的注入模型,比如说你是by tap的,那么就是by tap, 呃,不是track的,点by tap的这样子。
05:05
包括其他的我这就不再写了啊,还有好多好多,比如说他的构造方法的参数啊,啊,比如说他有没有depends on啊等等之类的,他把它放到这个对象当中,然后呢,他把他他再把这个对象存到了一个什么map当中,Map当中put一下这个对象,把这个A呢放进去来,好,然后呢,最后呢,是不是在便利这个map,从这个map当中把这些并defin是拿出来,然后根据这些并DEF的信息去实例化,比如说他拿到这个的时候,拿到这个A的时候,他发现这个A呢,它是一个PRO PRO type是个圆形的,那么它呢就不会去实例化,因为我们都知道圆形是一开始不会实例化的,只有等到你在用它的时候,你调要用get b的时候,它才会实例化它,所以spring大概的做法是这样子,所以你能明白病是干嘛的,他就是用来描述一个病的。好,那么这里呢,我再给大家讲一个并defin的一个例子,比较比较那个的例子,把这个让大家加深印象啊,就是理解更加理解并defin,我先把这个图给大家说一下,就是spring整个实例化病的一个大概的流程,跟b defense的关系是这样子的啊。
06:05
比如说你磁盘上存在一个X,存在一个Y类啊,我把这个呃X用一个颜色来表示一下,用一个这种绿色吧。这里有啊,用这个用这个蓝色的,那么这个蓝色就表示我们这个X是加的2的component的,Y呢是没有加2的component,也就是说我们如果是不能去扫描的时候,它只能扫描到这个X,是不能扫描到Y的,来结合我们的代码,我这里也有一个X,它加了other component y呢没有加other component对吧?好,然后呢,10分钟开始扫描,那么。他扫描出来的话有多少有有有有扫描出来有几个,但是我这个图好像画了一个有几个来着。我先把这个图改一下。嗯,我改过来了,我们接着来看这个图啊,就是你假设你现在一扫描的话,你是不是只能扫描到这个X,好拿到这个X之后的话,把这个X的一些属性的进行一些,呃,当然你这个扫描几个它就会变利啊。如果说你有三个,就可把这三个都并列出来,我这里只有一个,好把这个X呢,变成一个并different对上,然后呢,把这些属性给它填充上,比如说你的这个并class是谁?那么这里是谁呢?就是我们的X对吧?好,它的一个laz的话就是软加载是什么呢?是Force,它不需要软加载,因为我们的X并没有配置软加载嘛,还有没有印象,因为X什么都没有配置对吧,也没有配置好,包括它的一个作用域啊,它也是single的,是单立的,也没有什么原型的,因为它默认就是单立的嘛,我们也没有去对它进行一些配置啊等等之类的其他信息啊,因为其他信息他家都不是很懂,我就不去讲了,总之他把这个对象6出来,然后把这个属性填充上,填充上之后的话,把它放到这个map当中,那么这就是我们刚刚说的这个叫b defense map了,在这个map放到这个map里面,那么呢,Key就是我们这个类的名字,就是X,就是你这里面提供的这个名字了。
07:43
啊,你这个地方默认是不是叫做X引号,引号X小写嘛,对不对,你如果提供了,比如你叫做什么这样子,它就是AAA,随便你,你如果没有提供的默认就是用的这个X这个名字啊,就是这个key why掉的话就是我们这个对象,注意这是一个对象,我说的就是啊这么一个对象放到这个map当中,好放了之后的话,他过去怎么样呢?接下来Spring会去调用这个并factor possible, 这是。
08:04
就是来开始对我们我们刚刚讲过什么是并factor post这策,那么接下来呢,Spring他已经完成了扫描对不对,你完成了扫描之后的话,讲到底你是不是要开始来实例化并呢?但是呢,Spring就在实例化并之前,他可能会怎么样呢?会呃呃呃会怎么呢?会就是说可能你程序员可能要对我们整个容器进行一些全句化的一些配置,进行一些个性化的定制,所以他在完成spring的这个bin的一个实例化之前,他去调用这些并factor possible process, 看一下你有没有对你的容器进行一些设置,好我们这里是没有的,因为因为我们的代码的话,比如说我把这行代码注射的话,它是没有做任何设置的,我们先把这里注射啊,好,没有的话,那么这个代码就接着往下执行,执行之后的话,他会去把把我们把我们这个X从这里面遍辑出来,把我们这X拿出来进行校验,比如说你是不是单立的,是不是懒加载的对不对,如果是单立,如果是圆形的我就不遛,如果你是懒自载的,我也不遛好我们这个地方是正常的病,那么他校验通过之后的话,那么他就开始了实例化这个病,那么实例化正常就会把它put到这个单体子当中,那么这个X就在这个里面。
09:03
这个就是最正常的流程,所以说我们这个代码的话,你一旦这么执行的话,他就会去调用这个什么,呃,Get bs可以拿到这个X吗?这是没有问题的,好吧。怕就怕什么了,来是这样子,怕就怕前面如果你听懂了之后的话,来这样子,当他把X扫描出来,把它放到这个并单map当中之后的话呢,那么当他调用我们的并factory post的时候的话,这是一个list啊,就他会拿到所有的并in factory post进行一个呃,回调执行,那么如果你提供了一个,那么这个线就会走这个红色线,对不对,假设你提供了一个,好,我们这里提供一个呢,就是我们刚才看到这个什么样提供的这个叫做test并impact possible设置,假设你提供了一个,你提供了一个之后的话呢,你呢,从这个map当中把这个X拿出来,你看吧,我这里是不是通过这个X这个名字,是不是把这个BD。把这个对象拿出来了,这个对象一拿出来就对应的这个X,就是我们刚刚看到的这个对象对吧,图像这个对象吧,把这个对象拿出来之后的话呢,我呢,它里面这个作用欲是不是single。
10:05
我们不考虑作用域吧,我们考虑这个class了,它的class代表了我们这个X这个类,我把它给改了,改成Y,改成了Y,好改成Y之后的话,然后我把它放回去,这个是拿拿拿出来去执行啊,然后就把它放回去,放回去之后的话,那么代码接着往下执行的话,那么他再个去校验,再去执行的时候,再去什么实例化的时候,那么他实例化出来的这个病呢,叫做Y病了,他的名字就是病的名字还是叫X,只不过呢,对象已经成了Y,那么呢,我们可以来试一下,这个时候你再跑的话,那么我们整个代码它会报错的啊,他会报一个什么错,他会报一个,说没有这么一个,并找找找到,因为你在这个地方拿的是X,实际当中有没有X呢?是没有的,你跑吗?这里面根本就没有一个X类型的病在里面。他才会报这个错,他是没有找到这么一个呃,X的B码,但是如果说你把他名字改成什么东西啊,改成引号,引号改成X,那么他能不能拿到啊,他是可以拿到的,他不会报错,至少。为什么呢?其实也很简单,因为我们这个Y这个病他就是什么,你看他的Y是被创建的,他的名字叫X,因为我没有改名字,我只是把它类型改了,偷梁换柱对吧?这样子大家能够更加形象的理解这个什么样呢?并Definitelyin,它是用来描述病的啊,总结一下就是不了,一开始扫描,扫描我们的类,扫描我们类的信息中的,把我们类的信息的进息一些封装,封装成为一个对象,叫并的对象,然后把它放到一个map当中,正常流程情况下,那么spring会去怎么样便利这个map,从这个map里面把我们的并拿出来去干嘛呢?去呃,实例化,最终的话就是你看到那个病就是长这个样子,就这样子,那么的话呢,我们这个并factor possible, 我们刚刚讲过,它是能够对我们的容器进行一些怎么样的全局性的设定的。
11:40
那么你这个并different map肯定是属于在容器当中,对不对,这个并different map它也是在这个容器当中啊,那么我能对容器做一些全局性的设置或者一些配置的话,那么我就能从这个逻辑当中把你这个map当中的一些什么样的key拿出来,然后改了,改了之后你再去怎么样的去执行的时候的话,那么就看到的结果就不一样了,那么这是一个现象,通过这个现象我相信大家对这个B应该有了一个比较直观的了解,那么接下来的话呢,下节课我会就下个视频吧,我会带大家把这个我刚刚讲的这个东西的话,通过一些代码进行一些呃调试,给大家看一下这个我们刚刚讲的东西是不是按其实思不原法是不是这么写的,这个只是现象对吧,好,那么嗯,你对并得了解之后,我们才能来讲这个方法,所以这个前置知识相当重要,希望大家能够嗯,掌握,嗯。
我来说两句