00:00
好,那接着前面我们step into就用这个wrong方法,而大家注意这个wrong方法呢,其实还传了一个AX,这个A说的其实就是我们以前呢,我们这个炸包一启动,我们可能通过命令行会传一些参数,这不就是这些A嘛,所以大家就可想而知,在这一步X能传进来,那未来我们对命令行参数的解析肯定也会得到的。好,我们的STEP1录进来,那整个的run的流程呢,就这么多,那第一个它准备了一个stopwa,相当于停止的这个监听器,然后呢,这相当于拗了一个对象。Stopwatch啊,运行application,第一个就是stopwach,相当于我们来监控,监控我们整个应用的这个启停的stopwa呢,上来以后呢,它先调用了一个方法叫start start,我们step into进来,这个方法呢,它再来step into进来,发现这个方法特别简单,还是给spring application啊,也不是spring application给stopwa里边保存一些信息,像当前我们这个任务的名字,以及我们当前的这个时间啊,我们这个纳秒时间,好把这个信息呢,我们保存起来,相当于它就在这记录了一下,哎,我们是哪一时刻我们启动的,记录应用的启动时间,哎,我们就看到了一个这个事,那应用的启动时间记录了以后呢,下来第二步叫create boori的contest,相当于创建我们引导上下文,创建引导上下文。
01:35
所谓的上下文,就是我们以后见到什么的context,都是我们当前引导环境上下文,然后我们整个应用的引导启动环境,它里边有哪些就是在这一块创建的,来看看创建引导上下文就是这个方法,它里边又做了什么?的每一个方法是有什么,我可以给大家在这标注一下,好创建应用的引导上下文里边来step into进来,进来以后呢,我们会发现它在这呢,创建了一个默认的引导上下文,像这个对象呢,默认以后就会给里边这个东西,以后呢,就会给里边保存很多的信息,这些信息呢,就会在这个上下文环境里面保存,但是大家注意这呢有一个关键叫this boot strippers,然后呢,这个BOO stripper掉一个for each,这个boopers是什么呢?是我们的这个东西,所以我们之前呢,会在配置文件中,如果你配了这个booper,点进来这个BOO呢,是这个接口。
02:37
我们把一些关键的接口给来放在这,也就说如果人家一开始找到了你的这些bootri,相当于我们的整个引导启动器,找到了以后呢,接下来它就会调用我们的这个方法,你如果自定义了引导启动器,它会把所有的引导启动器for each遍历一遍,然后呢,每一个引导器,引导启动器就会调用它的引力受拉方法,因为我们看到引导启动器的这个接口,它里边有一个方法叫引力受,它传入我们这个引导的这个注册工厂,然后呢,这个工厂里边呢,我们就可以给他加入一些当前上下文的一些引导环境信息,所以呢,我们现在整个这一块的核心就是获取到所有的,获取到所有之前的,之前的我们之前呢已经找到并保存好了,之前的butpers,然后呢,挨个执行,挨个执行。
03:37
执行它的引内收let方法来完成,来来完成对咱们这个引导上下文的环境信息设置,对引导启动器上下文环境设置,而我们现在这个引导启动器呢,一个都没有,如果你想写了,哎,你可以在small factor里边写一个没问题,那我们现在呢,看到这个引导启动器我们没得执行以后,我们就结束了,接下来在这又有一个叫con来配置我们这个headless propertyties proper slave into进来,现在他给系统属性里边设置了一个这个东西叫Java a wt headless,想让它进入啊,让当前应用,让前应用应用进入headless模式。
04:37
这个模式是什么?大家可以百度一下,这个模式呢,简而言之啊,就是自力更生模式,哎,别想依依赖别人,好,那我们这个应用呢,现在就进来了,那现在我们这个应用进来了以后呢,OK,我们把这个整过来,然后我们这个con headless property我们就结束了,接下来呢,这还有一个叫get roll listener,然后呢,Run listener呢,这个东西会在这保存一下,然后这一块我们叫获取所有的运行时监听器,获取所有wrong listen呢,我们称为叫运行监听器,这个运行监听器是什么我们也不知道,因为我们现在呢,只把它们的过程分析过来,至于他们是什么作用,们分析完过程一总结就OK了。们来看一下这个run listen呢是什么东西,Step into进来,他想怎么获取run listen呢?现在呢,拿到我们这个spring开,当然上下文大家注意还是一个get spring factor instance。
05:37
得到一个spring application wrong listen,所以呢,他想要获取,获取的步骤就是还是去,只要我们说你看到了,这个方法叫get spring factor instance。它的作用呢,就是还是去我们指定的去spring factory这个文件里边找谁呢?找一个东西叫spring application wrong list呢,所以关键的组件呢,我给大家打一个红,去这找这个wrong list呢,而找到了以后呢,接下来怎么办,我们来看一下啊。
06:20
来找到找到,我们来看能找到几个吧,那先在这,而且他找到以后呢,又了一个wrong listeners,这个listeners呢,相当于把找到的所有listener就保存了一下。那我们就来看啊,我们把这个所有找到,我们来看找到了几个,走listeners listeners里边来找listeners,它里边保存的listener,诶它呢,在这保存了一个,哎,只有一个listener,所以他找到一个,那我们就不妨来看这一个listen呢,它从哪找到了我们的之前的分析的这个spring factor里边有没有他呢,要找的相当于在factor里边找spring application wrong controll f搜一下,诶正好有一个叫event publish wrong listen呢,来看一下它的这个listener呢,里边的这个listen呢,确实叫event publish wrong listen,所以呢,现在我们就是来到了这一步,找到所有的这个在这配置的listeners。
07:19
而这个listeners的接口是什么?就是它,我们把这个listener的接口拿过来,CTRL f12,我直接把这个方法拿来吧。Application run。来记录到下边好。我们看到呢,关键的这一步,他找到所有的spring wrong listen呢,然后呢,找到了以后,接下来他要做的事情,这个listen呢,他找到了,并且保存到spring application wrong listener保存了以后呢,将下来它会调用一个叫将第二步叫listeners.starting然后呢,这个点starting是什么?来step into进来,然后呢,接下来我们就会看到这有一个叫do with listeners,这个do with listeners,我们再来step into进来,这个do with listeners呢,它就是一个叫listen for each,什么叫for each呢?就是遍利所有的listeners,把我们当前这个现在我们进行到哪一步了,像这一个相当于一个事件信息,我们遍历所有的listen,便利所有的listen,然后调用它的什么方法呢?叫starting starting方法,所以呢,接下来就是。
08:36
便利所有listeners,便利所有的这个。Wrong list呢,然后呢,调用它的这个study,这个相当于是什么我们来分析这个wrong release呢?我们一听是运行式监听器,所谓的监听器就是我能监听到当前项目的这个状态,那么正好呢,项目运行到这一步了,就是我们项目呢,运行到这一步了,我们就会调用所有监听器的startinging方法,相当于告诉你,哎,我当前项目正在启动,哎现在这是一个事件通知机制,在这儿通知所有监听器,通知所有想感兴趣,通知相当于以上的操作,相当于通知所有感兴趣,感兴趣干嘛呢?感兴趣系统正在启动过程的,正在启动过程的人,然后呢,然后我们这个项目正在study。
09:41
所以呢,有可能我们希望在项目正在开始的时候,我们可能要获取一些信息,或者做一些什么,这就相当于我们要自定义spring boot一些底层行为了,我希望项目一启动的时候干一些活,那相当于我们自己就可以写这些wrong object listen呢,然后呢,项目一启动的时候,人家这些因为它是一个便利调用,所以呢,你的这个list呢也会被调用,然后呢,你就会感知到这个事件,所以呢,最终的这个作用就是为了方便所有的人,为了方便所有list呢,Listener进行事件感知,进行事件感知。
10:22
诶,对了,我们现在的这个顺序呢,是在这样,我们来看一下啊好,我们在这呢,让它执行,执行完了以后整个结束执行好,我们现在呢,获取到所有的监听器以后,接下来他把所有的这个listen都已执行,所以呢我们的这个步骤在这。在这啊,你前面呢,已经获取到你的所有的这个wrong listen了,我们接下来就来调用所有的wrong listen的startinging方法,现在这是我们的第一个事间啊,我们感知到了系统正在启动时间,那接下来第二个我们又准备了一些application argues,现在我们应用的参数,这个应用参数其实就是从我们命令行里边传过来的参数,想来它这一步TRY的这一步,它呢就是来保存命令行参数,因为这一步呢,命令行参数我们未来可能还要用,所以它提前保存过来,那就是我们的这一块,保存完命令和参数以后,我们继续来看它干嘛,它在这呢,有一个叫prepare environment来准备我们的环境,大家注意,在准备我们整个运行式环境的时候,它又传了一个listeners,我们所有的监听器,好,我们来step into进来,好,我们发现呢。
11:42
在这准备环境的内容,它的真正的准备环境的准备环境。准备环境,准备我们这个环境信息prepare environment,它是调用了这个方法,准备环境里边它都准备了哪些什么,我们可以进来看一下,它现在第一个叫get or create environment,你如果当前上下文有环境信息,我们就给你获取,没有就创建,相当于它无论如何就先得搞一个环境过来,如果有呢,就直接给你返回,如果没有,我们当前呢,应用是一个web应用,我们是一个so应用,就会返回一个so,这个environment。所以呢,它要做的第一步返回或创建一个新的环境信息,基础环境信息,所谓的基础环境信息,相当于就是保存了我们底层运行的一些环境变量啦,或者等等各种东西。好,我们这个基础环境信息呢,它就叫standard so environment,这个里边呢,有保存我们的一些基础的solid一些信息,我们可以来。
12:47
把这一块呢,我们来返回啊,这个环境呢,我们来得到了以后,将来它有一个叫con菲environment配置环境,配置环境的时候呢,会拿到我们的相当于参数,我们命令行参数传了一个命令行参数,还传了一个环境信息,所以我们接下来第二个。
13:04
首先得到基础环境信息对象,然后呢,接下来在配置咱们这个环境信息,因为我们前面呢,刚得到了这个环境信息对象,接下来呢,我们这个配置,这个配置呢,它又是怎么配的?先拿到我们这个命令行参数step into进来,好,我们这个命令行参数没传上,不用管,再次带into进来,来看啊,配置呢,相当于给我们整个环境里边添了一些conversion service,这个conversion service这是什么呢?这其实就是我们的类型转换器,我们要把呃,String啦,转成in配啦,各种东西,因为要读取配置文件,配置文件里边配的呢都是string,我们可能要把这个string转成年龄H等等,我们就需要这些类型转换器,这个类型转换器加在这,我们先不管,那接下来呢,还有一个叫con profit第source,这就是呢,加载我们外部的这个配置源,因为我们以前呢说过我们还有一种方式呢,就是我们可以使用一个这个注解。
14:03
我们来CTN加an pro party。Source可以来读取到我们外部的这个配置文件,所以它在这一块呢,相当于是来加载我们全系统里边所有的配置信息,所以大家看到,那么这一块呢,先整到我们所有的配置源,哎,我们到底要配置哪些信息,在这一块呢,都有我们这个配置源里边的数据,比如呢,其中呢,就有我们的system properties system environment这两个东西呢,我们之前获取过,所以把所有的这些配置信息他都拿来。拿来以后呢,在这儿包括呢,如果我们有命令行的属性,把这命令行的这些信息也会填到我们这个里边,所以我们可以不用管,所以呢,我们的这一步在我们配置环境信息里边,先来读取所有的。配置环境信息里边读取所有的配置属性,配置源属性值源的配置属性值,所以要把所有配置源里边的配置的KY我们都读来,包括我们环境变量的都读来,还有一个叫con pro pro这一块呢,相当于是来激活我们这个profile环境啊内容的,但是我们这一块呢,Step into进来这一块没有写任何东西,因为我们当前这个系统里边我们没有配置profile fair相关的东西,好,我现在就过了,那我们前边呢,这个配置环境信息就好了,然后把这个环境信息呢,接下来绑定到这,这个绑定呢,其实就是一个保存工作,我们倒不用管了,但是接下来注意有一个叫listen environment prepared。
15:43
然后呢,这步方法是什么。Listeners,当然以后呢,见到listeners,就是我们之前获取的到的所有的这个wrong listen获取到的所有这个东西,就是我们说的listeners,然后呢,接下来它配置环境对象读取配置咱们这个我们来看一下啊,它这个配置环境对象配完了以后呢,绑定我们这个信息绑定绑定环境信息绑定完了以后呢,接下来他在这还做了一步叫listeners,像所有的监听器调用environment prepare的方法,然后呢,监听器监听器调用这个方法,而这一块的调用是怎么调用呢?我们可以给大家来看一下啊,我来step into,进来step into,你就发现呢,还是do with listen拿到所有的这个在所便利里所有的listener,然后呢调用每一个listener的。
16:47
Prepare的方法,我们之前来看这个listener呢,Starting代表我们当前应用正在启动,然后呢,还有一个事件时机叫environment prepare的方法,当前环境已准备就绪,所以呢,接下来调用这个东西相当于通知所有的监听器,通知所有的监听器,如果我们有自定义的监听器,我们也会被通知到同时所有的监听器,那么呢,当前环境准备完成它呢,最终就会调用listener的这个方法的environment prepare方法,好,这也是比较关键的一步。
17:29
好,那么这个调用完了以后呢,我们再来看他干了什么,他现在既然通知了所有的监听器,我们当前的这个环境已经准备完成了,将下来呢,它这木头end想要把我们这个环境信息,呃,设置到这个类的,最后我们也不用管了,然呢,这有一个叫confi additional pros,像我们配置额外的这个pros,我们要激活哪些环境的,那这一块呢,就是来读取我们这一块,如果我们有环境的配置,那现在要激活哪些额外的环境,那在这呢,就给我们激活。
18:04
那么这块也不用写了,还有一个叫帮的兔,这呢又是一些绑定工作,这个我也不用管了,所有的这些绑定你进去都是找到一些东西,哎,比如把这个属性呢,绑定到这个值里边,我们都不用管啊,然后呢再来接下来,然后呢,它判断判断呢,我们在这又准准备了一个什么叫environment convert,反正都是在这准备环境信息啊,我们就结束了就行,然后呢,在这准备完了以后呢,叫configuration property source,把这个环境信息再一绑定,全部完了以后呢结束,所以呢,我们在prepare environment结束以后,我们所有的环境信息准备就绪。然后呢,环境信息准备完了以后,我们接下来看怎么办,接下来就进入我们这个流程,叫con ignore being,英法相来配置一些我们需要忽略的being信息,我们也不用管了,然后接下来这一步呢,叫print banner,像要打印banner这个东西呢,我们也不用管了,这个大家看啊,至此都没有打印banner,我这个方法要一放行banner就打印过来了,哎,这就是我们的banner。然后接下来呢,最重要的有一个叫create application contest,创建IOC容器,好,所以接下来非常重要的就到了我们运行spring应用的时候,我们接下来就要创建IOC容器,就是我们说的创建application contest,这个东西至关重要,那为什么呢?因为我们知道什么叫IOC容器,那就是我们说后来所有的组件都在容器里边,所以我们一旦容器一创建容器里边的所有组件,它呢都要进去,所以我们这一块呢,是先来创建一个IOC容器,来看怎么创建图进来。
19:42
非常简单来看我们当前的这个类型,根据这个类型我们调用create方法,如果我们当前类型呢,是一个类型,它创建一个叫a con select web server application contest,所以呢它在这创建IOC容器,它是根据当前项目类型,因为我们当前呢是一个solid创建容器的,所以呢我们当前会创建,当前会创建这么一个容器叫a notation con so web server application contest,那这个容器创建完了以后呢,接下来我们来看干什么,现在它给我们准备了一个容器对象,这个对象呢就相当于扭出来了,扭出来了以后呢,这个IOC容器被保存,然后接下来IOC容器再来记录我们当前应用的start up这个事件,好把这个start up这个信息我们保存起来,接下还有一个叫prepare contexttest,准备我们这个容器的。
20:42
OC容器的信息,前面是准备我们基础环境信息,现在就是准备我们IOC容器的这个上下文,大家看传入的是IOC容器,还有基础的环境信息,以及所有的listen呢,以及我们的这些参数信息,包括我们这这些banner等等各种东西都有,所以呢,接下来准备IOC容器,IOC准备啊,不对,开contest,也就是我们说的。
21:11
IOC容器容器的容器的咱们这个基本信息,哎,那接下来呢,他就要在这一步了,准备IOC容器的基本信息了,他刚把IOC容器创建完,接下来呢,他就要准备IOC容器的信息,怎么准备呢?来step into进来,它是调用这个prepare context的方法。好,大家注意一下,然后呢,接下来我们来就进来进来我们prepare context step into,我进来进来呢,它给我们IOC容器先保存我们前面的这些基础环境来,基础环境信息呢,摆保存到IOC容器里边,相当于是我们的这个叫这个里边,这个里边呢有我们的环境信息。好,环境信息在这,像LC容器里边啥都有啊,我们环境信息也有,还有一个叫post process,我们后置处理LC容器。
22:07
在这一块呢,保存环境信息,然后呢,LC容器的,LC容器的后置处理流程,所谓的后置处理流程就是我这个IOC容器还要干些啥,来step引头进来,这个IOC容器呢,相当于准备一些啊,比如啊要注册一些组件啦,他在这儿判断我想要读取配置文件的资源啦等等,它还有一些资源的加载器啦,包括我们。因为我们还需要一些类型转换,所以他整个给LC容器里边再来准备一些,呃,这个叫类型转换器啦,等等,他把这些类型转换器的这些实例呢,都准备好,那这都是准备,这个must可以先不用管,那注意这呢又有一个叫play English initialize,你翻译这个呢,我们翻译过来就叫应用,我们的这个初始化器,应用初始化器,所谓的应用初化始化器是一个什么样的流程,来step图进来,它给我们传了一个IOC容器,Step图进来,那大家看啊,这有一个get initializes这initializes是什么?就是它,它呢就是我们之前说的。
23:22
这。在哪呢?有内收lazar。应该在前面对,我们在创建spring应用的时候,我们把所有的这个initial是相当于spring factor里边的application context initial,现在它是找这写的,所以呢,它接下来呢,在这一块最核心的就是所有的这个initial拉都来调用它的initial拉,然后呢把IOC容器再传过来,所以呢,我们这个initial laer它呢两个两个时机调用,首先第一个时机它准备好initial laer的这些信息,然后接下来呢,在这一块这一块应用初始化容器,它的这一块核心就是便利所有的这个东西。
24:09
叫application contest initialize。然后呢调用,然后呢,这个initial拉的这个引initial LA方法终于是在这一刻来调用了,这一刻呢,应该是它第一次调用它,调用它来对来对来对IOC容器进行初始化,然后呢,我们IOC容器其实呢,它已经初始化的差不多了,相然我们是对IOC容器进行一些扩展初始化的扩展工作,我们还想干些啥,那我们就在这里边来写,如果我们有自定义的引内数拉子。那我们就可以在LC容器都准备完以后,我们在我们的引内收laer里边再来干一些事,好,那我们现在呢,就来看我们现在呢拿到一个引initial LA,这个initial LA叫delegating application,这个contest initial。
25:07
它调用它的这个以initialize方法,这个引initialize呢,就是把我们的这些基础的环境变量信息拿到,然后拿到我们引initial拉的这些class,然后把这些引力数拉A的class呢,如果如果它不为空,因为我们现在我们之前呢,看到了在这初始化的时候呢,没有整过东西,所以如果不为空的话呢,就把他们这些实例给给我们整过来,好,我们现在呢,已经没有这些信息了,我们就直接给他放行。看看这个initial拉有多少呢?Application contest initialize。好,这有七个,这七个呢,是我们之前在这说的吧。我们之前在哪儿应该有记录过这七个引力拉。就是我们在这获取到的这个引力数拉字我们没记录,那我们把这块呢,就截一个图。
26:02
这个东西呢,其实就是你配置在spring factor里边的,我之前在确定一下啊,在点factories里边,我们配过这个什么东西,English initial拉,OK English initial拉,就这些啊。好,我们把这个引力数拉,你们也拿来。把这个图放大,所以呢在这一步它就执行了所有initial拉的initialize方法,而我们这个容器中呢,Initial laer我们之前配的很多各种initial laer有各种不同的,比如我们这个initial laer,它有contact ID,想给我们IOC容器给一个ID的,所以呢,他在这准备一个IOC容器的这个ID,把这个ID呢设置到IOC容器里边,想让它生成一个自定义的idd呢叫application,求诊呢叫什么零,把这个ID信息放到IOC容器里边,然每一个IOC容器都有一个它的编号,好这样就完了,那各种引initial拉呢,就有各种的功能,我们可以把这一块放行,所以initial拉A全部执行完了以后。
27:11
接下来它会调用listener contest啊,Prepared,所以境内收LA,我们在这儿执行完以后。我们在这准备IOC容器的基本环境,然后呢,应用初始化器便利所有的OB count引力来看啊,在这便利我们在这儿准备上下文环境,还是在这儿。好准备,就是这个test,我们遍历完所有的application contest initialize以后,接下来它会调用listener contest prepared,然后呢,又是所有了便利,所有的便利,所有的listen的listener,然后呢,调用,调用我们的这个方法叫contest prepared,相当于当前IOC。
28:06
容器的上下文已经准备就绪了,而这listener又是哪些listener,这又是我们之前说的,我们这个B1启动,它会得到application listener这些东西,所以就是调这个东西了,我们不妨来看一下step to进来,好,我们来do listener step图进来,他呢,就在这do listener调用所有的do with listener进来,然后呢,他拿到所有的这个listener,这个listener呢,因为目前只有一个叫event publish这个listener。这个listen呢,大家翻译过来,这叫什么叫事件,事件发布的这个listener,所以我们把这个listen呢也放到这啊,所以我们会发现这些回调机制啊,处处存在,只要我们自定义的组件,我们就能随时感知我们这个IOC容器的任何时候要用listener的这个contest prepared。
29:08
而实际的这个listener呢,是一个这个叫event publish。Copy value。哎,我们没有,这个相当于我们叫疑问publish。相当于事件派发的wrong listen,好,它调离所有的listen呢,调用这个EST prepared,相当于这一步呢,就是通知我们所有的监听器,哎,我们这个contest prepared OK了,通知所有的的监听器,然后呢,Conest prepared。这个事件呢,已经完成了,然后我们LC容器的这个上下文环境已经准备好了,那接下来我们再来看啊,这一块调完了以后呢,我们就让他通知吧,通知完了以后。
30:06
接下来bootrip contextest想我们引导上下文的这个环境来关闭,这些关闭呢,都是保存一些信息,我们也不用管了,这些都不用管了,都是日志记录一些信息,然后呢,拿到我们的B番,拿到B工厂,然后呢再来注册一些单实例,然后我们整个呢,项目里边我们的这些参数命令行参数呢,它在容器中居然呢还是一个组件叫spring application arguments,它要注册进去了,我也不用管了,然后呢在这又打印banner对吧,那在这呢,包括把banner这个组件也是LC容器中的一个组件,你being factory regry想要给我们工厂里边注册组件,然后我们接下来就直接往下走吧,他拿到我们整个的所有的这个工厂,工厂这些准备完了以后呢,大家看啊,我们这一块准备完了以后,相当于我们的这个prepare context的方法,Prepare context的方法,就是它这个方法呢,一旦准备完了以后呢,接下来它在最后它又掉了一个监听器,所以会大家会发现。
31:07
监听器无时无刻的在监听我们整个应用的过程,这接下来呢,又监听的是叫contest loaded step into,还是我们之前的这这段代码所有的监听器。所有的监听器直接呢去来调用,调用它的什么呢?就是它的这一块叫contest loaded,相当于把这块复制过来。所有的监听器,又去调用所有监听器,然后呢,调用contest loaded,相当于呢,还是我们这个通知所有的监听器,哎,我们又一个活干好了,叫我们整个context,我们IOC容器已经加载了,所以呢在这啊。好,我们也不用管了,那至此我们的prepare context才完,相当于我们整个IOC容器的前置准备工作才完,这是我们准备IOC容器的基本信息,那准备IOC容器完了以后呢?接下来叫refresh con刷新容器。
32:16
刷新我们这个conest,就是我们刷新IOC容器,刷新IOC容器我们来把这个方法复制到这,刷新IOC容器又干什么,我就进来看一下啊,Step into进来刷新IOC容器,其实呢,在这呢,它先注册一个shutdown的这个hook啊,这个钩子,然后呢,在这有一个东西叫refresh,什么叫refresh,这其实就是spring的核心源码,我们step into进来,然后呢,这个ref step into进来,调用IC容器的ref方法,Step into进来,然后呢,Super在这ref step into进来,然后接下来就是我们spring容器的经典的整个初始化过程,出化过程呢,其中有一个关键的就在这叫initial or singles,就是单实例化所有的容器中的所有组件,然后我们在前置的过程中,已经把容器的所有基本信息都准备好了,哪些组件在容器中,哪些都都怎么着,然后呢,全都准备好了,接下来我们在这刷新S。
33:16
IOC容器,那就是刷新IOC容器的核心过程就是创建容器中的所有组件,但这个过程呢,完全可以来参照我们spring注解版讲解的这个内容,我上硅谷发布的spring注解版,那注解版的这一块的视频地址我在这儿呢也给大家发了,这就是我们spring的底层,好,我们这一块呢就不用监控了,那么LC容器呢,整个让它启动,这是spring整个启动LC容器的完整过程。我们直接给它放行,放行呢,接下来在这一这一步,这一步呢,其中就有一个包括spring的IOC容器启动的过程中,又有一些监听器,这个呢暂时不是我们研究的。
34:05
好,我们来让它启动完成。我们全部启动完成啊好,那我们refresh contest就完了,所以呢,我们整个IOC容器就创建完了,IOC容器创建完了以后呢,叫after refresh,然后容器刷新后要干什么刷新容器刷新完成后,工作完成后呢,要干什么工作,他呢就要干这些工作,我们CTRLC过来。来,Step into进来看一下step into好完之后呢,我们在这暂时没有干任何工作,那么就不用管了,还有stopwa stop相当于我们在这呢监听好,我们当前呢,整个容器全部启动完成,花费了多少长时间,我们在这儿呢,就来监控一下,整个全部启动完成了以后呢,接下来在这又注意调用listeners started又是所有监听器调用它的started方法。
35:05
所有监听器调用它的这个study的方法,相当于呢,就是通知所有的监听器,哎,我们又一个。事干好了,就是started,我们当前项目呢,已经启动了,这就看到我们这个spring of run listen呢,我们就有这么几个位置,Started也监控到了,Started也监控到了,包括我们啥时候哪些事件我们在这监控呢,我们都发掘到,然后呢,我们这个started也监控以后接来在这儿有一个叫Co runners来调用所有的runners。调用所有的runners,而这些runners又是什么东西呢?它是来用这个方法,我们可以进来看一下啊runners里边step into进来,然后呢,我们会发现它在IOC容器中,它准备了一个list,然后呢,Contexttest,那就是IOC容器,从IOC容器中按照类型获取两种组件,把这两种呢都放到runners里边,一种叫啊run,一种叫command runner,所以呢,它在这获取容器中的,获取容器中的呃绒的。
36:27
还有呢,获取容器中的。另外一个把这个拿过来,这个叫command line runner,这runner又是干什么的,全部获取,获取来以后呢,全部合并在这个集合里边,然后对这个集合排序,排序呢是按照a notation away,现在按照注解有order注解排续的,所以呢,前面的这几个合并所有装的,并且按照按order进行排序,你可以指定哪些runner呢,是第一位,哪些是第二位,指定完了以后呢,怎么办?它呢,相当于是把所有的runner拿过来,大家注意啊,他把所有的这个runner拿过来,因为我们现在没有写任何runner,如果有写了,就把所有的runner拿过来,然后呢,靠装的调用便利,接下来他如果有装的,接下来就是便利所有的装的,然后。
37:34
那遍利所有的runner,遍历所有的runner会干嘛呢?你是这个runner就调用这个方法,你是这个runner就调用这个方法,反正都是一个方法,点进来就是调用runner的run方法,所以呢,便利所有的runner调用run方法。而这两个runner呢,呃,不开roundner,我们可以给大家看一下CTRLN在这,呃开始roundner,它是一个接口,有wrong方法CTRLC来记录到这,这都是我们容器启动过程中的一些核心啊,核心时机以及核心组件,包括呢,还有一个装呢。
38:19
这还有一个round,这个round叫什么,来看一下啊,还有一个叫command烂。CTRLN,给大家搜一下c line,好,这都是调用它的方法,CTRLC。所以呢,接下来我们在这一步遍历所有的runner,调用它的这个run方法,那这一块的调用结束了以后来看一下啊。这块调用结束了以后,哎,第二块调用结束了以后呢,就结束了,而且呢,如果大家注意看是如果有异常还会处理异常,处理异常里边呢,大家又注意还传了listen呢,然后呢,会调用listener的fair的方法,所以呢,我们接下来再来说如果以上,如果以上有异常,然后呢,调用监听器,调用listener的的什么方法呢?Fair的方法相于我们这个监听器啊,还有一个叫费能监监控到我们当前容器失败了,费的方法好,然后呢我们在这。
39:27
而我们现在呢,没有任何异常,完了完了以后呢,再来,接下来我们整个全部启动完成前面的这个步骤,也没有任何异常了,接下来呢,又调用listener的runninging方法,大家会看啊,如果前边以上这一步骤,哎,我们环境也准备好了,IOC容器也刷新了,IOC容器也启动了啊,所有的东西也都准备就绪了,也没有任何异常,然后呢,调用runner的running,相当于我们这这个程序真正的在运行了,调用我们这个监听器的所有监听器的容方法。
40:09
所以呢,我们又看到了这么一部代码叫listener running contest。好,那所有监听器的RUNNING1定要用,这个RUNNING1定要用呢,相当于就是通知,通知我们所有的监听器,哎,我们现在项目呢,又进入running状态了,项目呢正在运行,而且呢,上边如果有错误,Running如果有问题,比如我们自定义监定器的时候,我们running方法里边呢,我们突然实数零有了数学运算异常,如果有异常呢,还是处理异常,然后这块的处理异常呢,还是来调用我们所有listener的什么这的方法,所以呢,Running如果有问题,继续调用,继续通知咱们这个fail了啊,那就直接叫通知吧,通知这个非相当于呢,就是调用所有的这个调用listener的调用listener的field。
41:08
调用所有费,虽然通知我们所有的监听器当前失败。好,那在这一步结束了以后呢,我们来看一下。至此整个呢就全部结束,然后给我们返回IOC容器。好,我们一返回呢,整个运行完我们这一行代码就结束了,所以简单的这么一行代码蕴藏着我们spring boot整个启动过程的各个时机来做了哪些活,但这些时机呢,我们第一次拿过来,感觉好像没有什么多大的意义,但它的真正意义呢,就在于它指导了我们这些关键组件,比如有一些监听器,有一些runner,包括呢,有一些事件,我们什么时候发生,什么时候运行。
我来说两句