00:00
好,接下来呢,我们来看我们这一步,也就说我们初始化剩下的单实例来B,这个初始化怎么做呢?来step into进来,哎,这块是跟converion service,我们类型转换组件有关的,好,我们这个呢,就直接放过,我们主要看下边,包括呢,这还有一些值解析器,我们也直接放过啊,这一块呢,是跟我们这些啊,Aspire j viver有关的,我们也放过,好我们主要来看咱们下边往下走最后一步,最后一步呢,会来初始化剩下的单实力B,好,我们会调到这一步,我们主要看它如何初始化,这个是初始化剩下的单实例一,那么这个步骤是什么样呢?我们来step into进来,Step into进来以后呢,我们来看一下,哎,他第一步他会先拿到所有的being的定义信息,走,哎,这些being定义信息,我们默认。
01:00
啊啊,就是给我们容器中不管是我们自己写的还是人家默认的这些组件,这是容器中现在所有的B应,当然有些B应在前面的步骤可能已经啊创建过对象,初始化完了,那么接下来呢,它就是把剩下的这些B应看来挨个进行初始化,那么哎,这就有一个for循环,这个for循环呢,就是便利所有的鼻音,哎触发他们的整个鼻音的初始化逻辑,所以说呢,这是我们第一步,哎,获取容器中的容器中的所有B,然后依次进行初始化和创建对象,啊依次进行咱们这个步骤,那么我们进来看一下,那么呢,这会拿到各种宾,比如第一个宾,第一个宾他会拿到being的定义信息,哎,这叫being DeFinition being的定义信息,看这个宾是不是抽象的,是不是,但是。
02:00
力的啊,所以呢,这个第二步拿到B的定义信息,获取being的定义信息,这个定义信息呢,就是我们说的这个root b肯定是B的定义信息,然后呢,才在这判断了一下,判断什么呢?也就说如果咱们这个being啊,Is abstract非abstract,也就说不是抽象的,也不是单实力的,也不是懒加载的,说这个时候啊,毕应不是不是咱们这个抽象的啊,不是啊。我们再来看一下啊,哎,这是是单实力is single头,哎是单力的,是单实力的,并且呢啊,它在这还有一个判断叫是lazy in,懒加载的,是懒加载的,懒加载呢,也就是用到的时候再创建对象,我们之前呢也说过,哎也还说过LA于注解相关的好,如果是这种情况的话呢,哎,这就相当于我们要创建的B,我们来看这个F从740行开始,到我们763行结束,哎相当于整个大逻辑,哎就做完了,那么这是,但是呢,我们来看啊,它这又有一个判断,Is翻being,它来判断当前being是不是翻being,如果是的话,进行下边这个逻辑,如果不是的话,进行else的逻辑判断,哎,他在这又来判断判断是否是。
03:35
Factory being,这个factory being呢,也就是我们说的来看它的这个if判断好is factory being这个呢,就是来判断我们这个B是不是我们这个B接口的,要说啊,这是我们spring提供的工厂模式和是否是实现factor being接口的being,如果是这种being说明它是一个工厂,哎,如它就会调用factor being里边的get object帮我们来创建对象factor being接口,诶,这有get object就是来调它,这是我们之前也说过好,那么呢,我们第一个being啊,第一个鼻音呢,就是人家默认的这个叫internal,什么confiationation process来直接放行,如果不是,他就利用这个方法。
04:26
啊,如果是工厂兵应,他利用工厂方法创建对象,这个我们就不说了,接下来呢,如果不是不是工厂兵应工厂B,那么它就利用利用这个GA和B来创建对象,这个GA和B应创建对象呢,哎,我们呢,就给这打一个断点,我们来直接给它放行,放行到我们自己写到这个鼻音上,我们自己呢。我们自己我们来看一下啊,我们自己在这做测试的时候,我们这有一个配置来,我们自己给容器中会加补录,哎,会加这个B,也就说呢,我们给录的这个鼻音打个断点,好,我们现在呢就慢慢的放行啊,这是第一个鼻音的创建,你看啊,循环创建第二个鼻音啊,又来到它,第三个being音,哎又来到它,等等等,我来放一放其他的每一个的创建,现在呢,我们来放到这个my being DeFinition regry post process,那现在呢,一直要放到来,我们希望创建录对象来,那接下来再放上啊,两三次就到对象好,下一步来看,现在呢是mi being function的好,再来这是我们user service,再来,好,这是我们创建补录对象了,那我们来看怎么创建呢?它是调用get being方法,哎,就能创建出来,我来step inTo Get being呢,它就来调do get b。
05:55
整个get b的步骤,Get b b,那这个get b呢,就是我们自己写测试类的时候,我们调IOC容器的get b的这个方法,哎,就是我们以前的这个方法,测试类在这好,就是呢,我们调这个get b,这是一样的,但是呢,我们接下来以原码的级别,我们来看get b怎么做,它呢会调用都get b。
06:24
哎,这是咱们这个get b get b,它来调用我们这个do get b,好调用do get b,我们来看do get宾,再来step into,好,然后呢,他把咱们这个宾名字拿到,然后呢,它会第一步先叫get s,然后呢,先从咱们这里边先来获取B,这个叫share instance共享的B,也就是说如果以前有些B已经被创建好了,这B呢,就会被缓存起来,Get s就能获取到,说以前创建的单式利宾,第二先获取哎缓存中保存的单史力B,也就说如果能获取到,说明这个兵啊,之前已经被创建过了,之前被创建过,也就说我们说过的啊,就是所有创建过的B都会被缓存起来,创建过的咱们的单实例。
07:25
B都会被被缓存起来,我们一会也可以看到,所以说呢,我们可以先来看一下这个get深,它从缓存中拿,哎,我们来让他拿,哎,它就是从这个s objects里边,哎从这里边拿,这里边呢,就是我们已经创建好的这些B,哎,我们已经创建好的这些东组件,你看啊,包括一些其他的属性信息,环境变量都在这儿,哎,所以说呢,而它要从这呢,我们来看一下走来现在默认是空的,因为我们这个B没获取到,注意啊,它是从这个s objects,从这个属性,这个属性呢,就是我们这里边的,哎一个它。
08:10
啊,它是从这里边获取的,这里边呢,我们认为这个s objects这个map里边就是保存所有单实例的,我们也可以看一下点过来,你看啊,我们这个map它就是catch of objects缓存我们所有的单实例,比如说按照并应的名字和并应的实例对象来缓存起来,好而现在呢,没有拿到,没有拿到呢,我们就哎直接给它放行,我们现在是没有拿到,我第一次想从缓存中拿,我们肯定是没有的,然后呢,如果是缓存是空的,哎哎,往下走,往下走啊,我们从缓存中拿不到,那他就要往下走,走下边的流程,加上这个流程,他拿拿到冰番锤,拿到冰工程,缓存中拿不到,那他自然要创建了,缓存中获取不到,哎,然后呢,就开始比你的创建流程,创建对象流程,只要创建对。
09:10
一项流程是什么样的流程呢?我们来step,哎,它的第一步先来获取工厂啊,因为我们后来也是用工厂来创建对象,它还要获取一个什么负工厂,看有没有存在什么负工厂,特别是呢,啊跟spring mvc与spring整合起来以后呢,啊有一些负子容器,那么我们把这一块呢,我就直接放过,没有什么负工程好,然后呢,接下来他做了一件事,叫mark being as created,先来标记,我们当前being呢已经被创建了,它为了防止多线程的情况下,我们两个线程呢,同时都来创建同一个鼻音,这就不成单式,所以呢,它第一步先来标记啊,标记标记当前B已经被创建,先来做一个小标记啊,这个有一个比较严谨的细节,那么接下来它第二步还是一样,拿到病的定义信息。
10:06
好,来获取B的定义信息,获取B的定义信息,这个B的定义信息呢,拿到以后呢,接下来第三步,它叫mbd get de,喷字on,它呢是先获取我们当前B所依赖的其他比,哎,这就是第六获取当前比依赖的其他比这个得分子二呢,就是我们以前写的,比如我在配置文件,举一个例子来,我们要创建这个person比,而我们呢,可以利用这个depends on depends on属性来调整,也就是说我创建person之前,你先给我把book创建出来,包括更多的,比如呢,你要把user等等,然depends on来决定我们这个创建顺序,所以呢,在源码处也得到了体现,它第一步先拿到所有的啊depend子on它依赖的所有B来注意啊,如果有这些。
11:07
应它就哎get鼻应按还是调用get鼻应的方式,把我们依赖的鼻应先获取来,如果有,如果有还是按照按照咱们这个get be的方式,Get be的方式,把依赖的咱们这个be先创建出来,那么这个get b呢,它有创建B的功能,哎,我们一直在研究这个方法,哎,但是呢,我们发现它创建病影之前,他先做的第一件大事就是呢,把我们当前病依赖的病影先创建出来,好接下来呢,我们来看下边的,我们来看啊,它在这判断,如果B竟是单实力的来,它就来调用下边的创景,我们来step图好,我们B竟呢,现在就是一个单实力的,哎启动相当于单实例比应的创建流程,哎,怎么启动呢?我们来看啊,它就是。
12:07
调用get sing方法,调用这个方法,然后呢传一个并名,然后在这呢传一个叫B工厂object工厂,它利用这个工厂的get object来创建B,这个get object呢,也就是会调这个create b,相当于呢,诶它会调create b,我们给这打一个锻点,它会调这个来创建B,好我们来直接放行到这好我们要调create b了,我来step图走进来,然呢它会调create b create b来创建B,我们B的创建流程,哎,在这它调create b,要创建B,你来看它怎么创建走怎么创建呢,还是一样拿到B的定义信息来解析咱们这个B的类型,我们要创建的病音的类型,哎,它在这呢,是解析一些其他的这个啊病音的类型,然后呢,我们来往下走啊,主要看下边。
13:06
走。哎,这有一个,诶来看啊,这是第一步,先来result before in installation,哎,我们第一步并创建之前呢,它会调第一步在这。叫他before,这个是干嘛呢?这我们其实以前也见过,你看啊,他说给being post process一个机会来返回我们这个being的这个代理对象的一个机会,所以呢,这是哎,这是这一步是让being post,让b post process先提前拦截,先拦截返回代理对象,但是是这是哪个being post process在工作呢?我们以前也说过being post process有非常多,哎,有这么多,而我们正常的b process process都是在并创建完对象初始化前后拦截的,而现在呢,你看我们还没创建对象的,是调这个方法创建对象还没创建之前就有一个这个being process process是什么?Step图进来你看啊,它就是诶走。
14:21
就是这个说呢,是来看我们是不是process,就是呢,相当于它是提前执行这种类型的,并post processoration aware就这个这一块呢,就是这个post process提前执行,提前执行的咱们这个逻辑,哎,他在那儿怎么提前执行呢,他在这先给我们提前执行,哎,Being post processor的before来点进去走,也就是来判断我们这个post processor是不是我们这种类型的,如果是来触发触发我们叫post process beforeation方法,哎触发先来触发,触发触发我们这个方法,要说这是这个接口规定的,我们来看。
15:21
走它呢,会先来触发我们这个方法,这个方法呢,如果有返回对象,我们可以来看一下,你看如果说它触发的这个对象,这个方法有返回了对象,哎,如果不等于空,它就触发后边的after,哎,就是触发这个post process after就是我们这个啊接口们这个aware being post process接口规定的这个方法,就说如果前一个方法这个方法先触发这个方法。先出发这个如果有返回值,有返回值哎,然后呢,再出发出发出发们这个方呢,这两个方法的执行时相当aware post process规定两个方法的执行时在这好我们就呢直接给它放行走来你看啊,我们还有一个being post processor,就是这个来它呢来调用来看啊来调用来触发这个方法step into,哎正好呢,就是我们这个,我们来进来来拿来来只不过呢,他拿到所有的being post process要判断是不是这个类型,结果呢不是,所以说呢,我直接放行,哎有一个是现在第二个是叫什么configuration,这是来解析我们配置类的,哎,那相当于解析configuration注解及这些配置类的,哎他呢来触发啊这些方法包括呢,如果这。
16:58
看有返回值,它又来触发后边的这些东西,好们来看啊,如果有返回值好行,所有的post processor我们都让它执行。
17:09
放行了,好放行了,然后呢,如果有返回值,那就会触发这个方法,但是呢,我们之前也没啥返回值,所以呢,这是我们说的第一个process。
我来说两句