00:00
好,前面呢,我们看了一下这个application listener,那么这节课呢,我们就结合我们以前学过的所有内容,包括我们的这些整个流程以及原理,我们来梳理一下spring整个容器的创建以及初始化过程,通过对咱们spring源码的整个分析,希望大家对spring里边的内部的工作原理以及运行机制能有一个更深刻的理解。好我在这呢来创建一个新的文件,那在这里个文件里边spring source来记录一下spring的整个源码流程,那么我们说这个流程呢,我们主要来说容器的创建以及初始化过程,比如说我们在来在这个单元测试里边,我们这一块呢,是来拗一个IC容器,哎,我们用注解的方式传入了一个配置类点进去,那么前面呢,这些都是啊,做一些预处理及解析工作,那这个我们就不看了,就像我们之前的这个。
01:00
我们主要来核心来关注refresh,也就是说容器的创建及刷新工作,Spring容器,那咱们这个refresh,比如说创建容器的创建以及刷新,整个容器呢,就是通过这个reresh方法啊,运行完成以后呢,容器就创建,以及将所有的B也都创建,对象都初始化完成,那么好我们就来进来。单元测试好,现在呢我们来到这个re方法step into来看第一步,哎,这呢有线程安全的这个锁机制,好现在呢来到第一个方法叫prepare resh,按照这个方法的含义,它呢是这个刷新的预处理,刷新前的咱们这个预处理工作预处理,那么他这个预处理到底做了哪些活呢?能大致的进去看一看,史大夫经头进来,哎,这有一些什么清缓存,我们就不看了,然后这还有一个诶准备刷新啊与处理工作进来,进来呢,它这有记录时间以及记录一些状态,比如我们当前容器关闭了吗?哎,这是false,但容器已经激活,哎,这是true等等,拿来记录一些状态,好,这有打印咱们这个容器刷新日志,哎,我们刚才控制台这也看到了,好,将来第一个方法叫in property source,哎,他做的第一个活。
02:30
叫in property source,它是什么样的呢?按照方法叫初始化一些属性啊,初始化一些属性设置,那么这个东西呢,来进来看step into,哎,我们发现它是空的,哎,这其实呢,是留给子类来做事情的,如我们自己来可以写一个a notation con,不con此类来我们在容器刷新的时候呢,我们来重写,这个方法可以来自定义一些,哎,通过它,哎子类里边子类,哎,我们也叫子容器。
03:08
啊子类咱们就叫子类吧,子类自定义啊,自定义咱们这个啊属性啊,也就说个性化的,个性化的咱们这个属性设置设置方方法,哎这个呢,在自定义的时候有用,现在呢还是空的好,那么接下来呢,第二个这块呢,有自定义属性,那完了以后呢,这是来进行属性校验,如果你把这些属性都自定义好了,哎,这还能呃验证咱们这个必须的一些属性,只不过呢,我们现在没有什么自定义属性,所以说呢,我们现在没也没有任何啊校验工作,我们step引图,哎这一块呢,就拿这些属性解析器来可以进行校验,好我直接就跳出这是第二步,我们可以来进行属性校验,第二步就是它,哎校验咱们这个校验检验啊检验属性啊的咱们这个。
04:08
个合法啊等,那么这是第二第三步呢,我们来看它呢,创建了一个list,就是临时来保存一些,哎早期的这些事件,方便在呃合适的位置,我们来派发事件啊,它整一个这个的list这个的啊,它等于你有一个list,它来保存我们容器中的一些事件,保存容器中啊一些早期的事件啊,如果有事件发生,那么放进这个list里边以后呢,当我们这个事件派发器好了以后呢,直接用派发器把这些事件呢都派发出去,这是第一步,就是做了这么一些简单的工作,好这就做完了第二步,第二步呢叫time是being,按照字面意思,它叫获取being,比如说获取咱们这个工厂。
05:08
来看他获取being工厂都做了哪些活,好step into进来,进来呢,他调了第一个方法,什么re being factor,哎,刷新being工厂,好,我们叫刷新being,这个刷新being factor是做什么呢?我们来step into进来,诶进来呢,他就是在这给这个,诶他会来到这个application,来到这个类里边,诶给我们这个being也没做啥,就设置了一个序列化的ID,这个being,而且这个being factor呢,大家注意,我点过来就是在gene application context在创建对象的时候,哎,无参构造器里边就扭出来的,相当于呢,我们做了第一步,哎我们核心的这一块是创建了一个being factor对象啊,一个这个啊being factor叫ul list Apple being factor这个对象呢。
06:08
给创建好了,来看接下来,接下来呢,给这个冰方里边,我们来看它设置了一个什么啊,序列化的这个ID,相当于做一个ID标识,哎,这个ID等于哎一长串什么什么什么好,我们就来让它设置进去,直接过好第一步我们这个B方,并且来设置ID等等我们做完了,接下来呢,我们再来看瑞是being,接下它的第二步叫get being,获取being工厂,第一个reresh,我们认为可以是创建being工厂啊,所谓的刷新,那么现在呢,我们看到的就是创建being工厂,第二步呢叫get being方,Get being方做什么呢?Step to,哎,我们发现就是把刚才创建的这个being function返回过来,哎,这个being方的主要创建在这个generic,哎,它就是返回刚才这个gene application创建的。
07:08
咱们这个B翻出对象好返回它第三步,我们来看第三步这个B翻垂呢,我们就直接返回来,那么接下来呢,我们就直接是把这个翻锤返回了,哎,我们在这一步就返回了,我们创建好的这个兵工厂,如不果这个兵工厂呢,我们刚创建里边的什么东西都是默认的一些设置啊,所以说呢,这是我们将创建的工厂兵factor being factor返回,那么注意我们创建的这个being factor就是我们这个叫defaul list being默认呢叫他。哎,就是它好,那么第二大步获取鼻音方水我们就做完了,然后我们来看第三大步,接下来呢,这有一个叫prepare being方,哎就是呢,对being方做一些预处理设置,哎,Being方的B音方的哎预准备工作,预准备工作在这个里边呢,他对B音方哎鼻音方进行一些设置,那前面呢,刚创建好对象,还没有做什么设置呢,那接下来呢,我们看这一步,他要做一些设置,怎么设置呢?Step into进来你看啊,就给范里边放各种东西,放类加载器的,包括来放咱们这个支持表达式语言解析器的等等等等啊我们大致的总结一下第一步,然后呢,设置兵张锤的类加载器,以及支持的咱们这个表达式。
08:53
制解析器等等等等,哎,它会设置非常多的东西啊,包括呢,你看都是给毕竟工厂里边设置一些属性来走,包括呢还添加一个being post processor,哎来设置,哎添加一个叫application aware process,包括呢添加being post processor添加部分的啊,不是所有的添加部分的,比如呢,我们现在添了一个这个post process。
09:28
它的作用呢,我们之前啊也给大家都看过,它就是在啊我们这个being初始化以后啊,来判断我们这个是不是实现了application aware接口的,一会儿也可以看到好添加being post process,包括呢,设置一些哎咱们这个忽略的这个啊自动自动装配的这些接口,设置忽略的自动装配的咱们这个接,然后呢,像我们这些,哎像这些接口什么environment aware什么这个啊banded view,什么aware等等等等,像这些它设置这些的作用是什么呢?就是说哎,比如这些接口的实现类不能通过接口类型,哎我们来自动注入,比如说它设置这些是默认忽略的,好,那我们来第四步。
10:27
第四步呢,我们来看等等等等设置忽略了一大堆,然后呢,这还有一个叫啊注册可以解析的这个自动装配,呃,这个呢,注册可以解析的自动装配,这个所谓的可以解析的自动装配,也就是说呢,你可以直接在任何组件里边你写owa这些,比如你想要owa factor owa这些,比如说呢,我们能直接在任何组件中啊自动装配,自动注入,自动注入谁呢,就自动注入这些being factor啊,还有人家列举的这些resource啦,哎,都记录上resource,包括这一块的application event,诶这个是我们上一节课刚说的这个事件的这个发器,包括呢,还有咱们这个application,就是我们的LC容器呢,你在组件里边可以自动注入这。
11:27
这东西。那么第五步我们来看他还做了一些什么东西,好像这也包括呢,他也再来添了这个后置处理器,添加b processor,但是呢,它添的就是这个添加,它还是要填being post processor,只不过他添的是这个功能的being post process,比如说它会添加很多的后置处理器,后置处理器的作用就是在并初始化前后做一些工作,好那就让他填吧,填完以后呢,这有一个啊,什么contest,什么lot time啊,Viver啊,这些都是跟啊,对SP接支持啊有作用的呢,来看啊,这个就过了,它这是来哎,添加添加,添加咱们这个编译时的添加,编译时的UN aspect接支持,而我们现在默认的这些都是咱们这个运行时的动态代啊,所以说呢,这是咱们。
12:30
这些东西包括呢,给容器中,哎给我们B工厂中也注册了一些组件,比如注册了一个environment k叫environment,然后呢,值就是我们的当前的这个环境对象,当前的这个environment对象,Environment对象里面呢,有我们一些默认的属性,哎等等等等,所以说呢,它还给容器中第七步给B应三中注册一些能用的组件,比如哎,比如我们来举一些例子,就是这些,哎这个environment,比如注注册这个environment,包括呢啊,我们来看这个environment,它要注册的时候用的类型是什么呢?
13:19
哎,这个environment来我们来找一下啊,找一下诶点过来来看啊,注册这个environment,也就是说注册的就是我们这个,哎,Environment它类型是这样的,什么con environment,包括等等等等,我们也都可以来列举列举列举列举,还有咱们在这儿好来这是注册environment,还注册了一些什么system proper些系统的属性,系统属性呢,我们来看一下是一些什么东西来就是从environmentment中获取到的这个系统属性,哎,就是一个map,那map里边的这些KY6,哎系统里边的这些KY6都能获取到,包括呢,我们来看啊,这一块呢,就是环境变量里边的这些Q,还有会注册咱们这个系统的这个环境变量信息,哎,系统的整个。
14:20
块环境信息,然后环境信息呢,我们也来看一下,它获取到这个,这个呢也是一个map,就是说整个呢,我们这些属性设置啊,我们保存的这些KY6系统里边的这些设置都注册在这以后我们要用也可以owa,因为它是注册进来的,好这时我们第三步对B方锤的预准备,走走走走走走走好,那么这一步我们方就准备好了,相当于我们这个being工厂也已经创建了,里边该设置的属性也设置了,接下来他做这一步叫post process being factor。
15:02
那我们现在来看这个post process就应该是后置处理,在being factor后边来进行调用being factor准备工作完成,完成后进行的后置处理,后置处理工作,这个后置处理工作是什么工作呢?我们来也可以进去看一下大夫英透走,哎,我们发现这也是一个空的,这相当于还是给我们这些子类,子类呢,你如果写一个它的这个啊,我们这个LC容器的子类,那么在容器已经创建好以后,你可以重写这个方法啊,不是容器啊,是咱们这个冰番水,你创建并准备好以后,你来重写这个方法,对冰番水也可以来做一些更进一步的设置子类,子类通过重写,重写这个方法来在溶解,哎,在我们这个B方水创。
16:02
件并并准备完准备预准备完成并预准备完成以后做进一步的设置,现在这个呢,只是一个空方法,那么呢,我们来把它做完好,前面呢,整个就是相当于鼻音方,我们至此呢,我们先停一停,这一块呢,就是整个鼻应方锤的提前的预准备工作好以上呢。是B方锤的创建以及预准备工作,B方锤的创建及预准备与准备工作,那冰番水对象有了以后呢,我们接下来就是要利用兵番水来创建各种组件等等,那我们下一节课呢,接下来看后边的流程。
我来说两句