00:00
好,前面呢,我们说完了spring application对象的整个创建过程,也就是保存那些initializer以及listen,接下来呢,我们来看它第二步,来,我们运行程序,这run呢,我就直接接着上一节课的断点,我来step into,我们进来来run方法呢就有这么长,那这个方法呢,我们来拿过来。这里边呢,就包含了spring boot的整个运行流程,我们再来看每一个关键的步骤,它都做了什么。好,我们来看第一步。他呢,首先创建一个stopwach,哎,这就是开始开始停止的这些监听,我们就不用管了,他来启动一下,好,他呢接下来声明了一个conb application conest,哎,这是一个IOC容器,现在呢是空的,什么都没有,包括呢,这些属性都先声明好,这个confi headless property,哎,我们来into进来,这是跟我们做a wt这些应用有关的,哎,我们这个就不用看了,我们来往下放行就行了。好,接下来呢,注意下边有一个叫get wrong listener,哎,获取什么呢?获取spring application wrong listen,我们说的一个比较重要的这几个监听器,哎,有一个叫ER,在这一步呢就来了,可以看一下。
01:26
记录一下获取application run listener,那获取这个它是从哪获取的呢?来,我们step into,进来,进来呢,我们看到这个spring application listener,它也是get spring factory instance,哎,只要看到这个关键字,那我们也就不用看了。它呢,也是从。内陆进下,咱们这个买它英。这个文件夹里边的这个spring什么factor spring factor里边获取的,就是说我们要用有几个监听器啊,是需要配置的,比如我们这个监听器和前面的那两个,它需要配在这个spring factor里边,好我们就让它获取,获取完了以后呢,我们明显能看到这有一个叫listeners study,我们可以来让他获取一下获取。
02:22
我们呢,看他获取了多少的这个listener,这个listener呢,我们来展开啊,这呢有一个listener叫event publish listener,然后呢,这有一个叫listeners starting,我们来step into,我们发现呢,它其实就是把这些spring application run listener的所有starting方法回调一下,那可以看一下这个里边有哪些方法点进来,这个里边呢,有一个叫starting,还有environment prepare的,还有contest prepared contest loaded等等这么五个相当于回调的这个机制,而我们现在呢,先是来回调所有的好这一块呢,回调。
03:06
所有的这个spring application listener。的方法。Starting方法好,那么这个呢,我们就看到了,那接下来我们继续往下走,好来放行,我们来让他回调完,回调完呢,接下来第二步,他把我们这个X相当于我们这个啊命令行参数啊,用applications封装了一下啊,我们这一块呢,就不重要看了,这个就是一个封装命令行参数而已。好参数,那封装完了以后呢,接下来再来往下看,这有一个叫environment准备环境诶。这个准备环境。准备环境,这准备环境,我们看他做了些什么,来step into,哎,准备环境呢,首先来创建一个环境,哎。
04:08
这有一个获取或者创建,如果有那就获取,如果没有就创建,那么它相当于给我们来创建了一个我们当前IC容器运行需要的这些环境,包括呢,我们这个啊,是什么东西激活的,我们这些profile也是在这设置的,接下来呢,就是配置这个环境,那我们也就不看了,哎,注意这又有一个叫listener environment prepared,好,那这有一个准备环境,准备环境里边呢,它里边的步骤很多。它里边呢,有创建环境。创建环境完成后,哎,我们就说这个事,创建环境完成后以后呢,它又会回调所有的什么呢?Application run listener的我们这个environment的方法,哎,我们这又是我们这个事件的回调回调。
05:06
Application wrong listener。的,咱们这个叫什么方法呢?叫environment prepare的方法,叫环境准备完成,哎表示咱们这个环境准备完成好,那么这个准备完成以后呢,那我们接下来继续来往下。而且呢,他在这儿判断,如果是外部环境,他还能需要将我们转成外部环境,不是外部环境,他需要怎么做好来直接啊放行,那么这个环境呢,我们就创建好了,接下来是我们这一步叫print banner啊,这就是打印我们这个banner图标,我要直接一放行,我们可以来看一下,哎,我们这个得bug好,我们先来一放行,放行,那我们这个控制台,我们可以看一下我们这个控制台。诶,我们这个控制台debug控制台council,哎,我们这个spring的这个图标我们就打印过来了,好这个完了以后呢,接下来这一步application创是非。
06:18
啊,上边呢是打印,我们就不说了,这是创建applicationest。Application contest。它是怎么创建的呢?我们也可以带into我们来进来,来我们发现呢,主要它是在这来决定是要创建一个web环境的LC容器,还是创建一个普通的这个not LC容器,说它在在这按照判断得到这个类型以后,因为我们是web环境,所以这个conest我们会得到一个叫not conflicted web application完了以后呢,用BU工具,利用反射创建出loc容器,好,我们来放行,那么这个loc容器呢,那们现在就是创建出来了。
07:06
好,我们在这呢,记录一下创建啊,它是来决定是它是来主要在这来决定创建web的IOC还是普通的。LC。在这呢,它是来创建LC容器的,那么LC容器创建完了以后呢,接下来我们再来往下,这有一个啊fair fair,这analyzer呢,它我们来往下看,它呢,主要是出现异常以后,用来做异常分析报告的,好,那这个呢,我们就直接放行不管了。好,注意我们这个IOC容器创建完以后,这还有一个准备上下。准备啊,准备咱们这个上下文环境来准备我们它呢给我们传入了LC容器,包括呢入我们刚才创建好的这个运行环境,包括也有一些监听器等等等等,好,我们看它这个准备是怎么准备的,图进来,相当于呢大家看给LC容器里边把我们刚才创建的environment保存起来,哎,包括呢哎来LC容器这后置处理,后置处理呢,就是给里边我们来看S就注册了一些小组件而已,我们就不看了,好注意呢,再来往下,这还有一个叫apply initialize。
08:37
好准备上下文环境的,这个里边他又做了一些事。它呢,将我们这个environment保存到IOC中,保存到这个loc中来,我们IOC中的环境我们就用它,然后呢,主要这有一个叫a apply in initial。而且。
09:01
要apply in initial LA,而apply in initial LA是干嘛的,我们可以看一下来,我就看它,关键我感觉跟这些引initial拉,跟一些初始化T应该有关,我就来大夫into进来能看到呢,它是获取所有的引initial拉,调用什么呢?Initial方法,而这些initial LA是哪里有的呢?就是我们第一次创建spring application应用的时候,我们已经来拿到了所有的引力收物LA子,所以说呢,这就是在这一步,它是来回调。回调。回调回调之前保存的所有的什么呢?啊,所有的application initial applicationtest initial initial方法。好,这个方法也就是说在我们IOC容器啊,将环境准备设置好以后,它就来调用这些初始化器的引力收less方法,哎,我们看到这有一个初始化器,哎,它在这调好,你就让它掉,哎,这有很多的初始化器在这掉,好我们就直接来放行吧,好,我们看下一处打一个断点来放行所有的引内时LA调完以后呢,又有一个叫listener contestd,相当于呢,在这除了调引力受外,还要回调。
10:35
哎,我们环境准备好了以后呢,还要回调所有的什么呢,哎,所有的我们这个listener的contest啊,Prepare的方法,我来step into进来,就是这个spring application run也是我们之前保存好的。调他们的什么方法呢?还要回调他们的这个contest prepare的方法。
11:00
如果呢,我们这个监听器的几个方法的回调已经放在这儿了,好我呢,接下来继续好,这个断点呢,我们就来放行,那他所有的监听器回调完以后,哎,这是一些日志记录好来往下走。啊,包括呢,这一块啊,又从IC容器中获取,哎,注册啊,把我们这个相当于命令行参数的这个对象也注册进来,包括呢,把我们这个班ner啊,我们要打印的这些班ner也注册进来,哎,这呢相当于拿到我们这个主类,哎主类包括诶等所有的我们这个prepared contest prepared contest运行到最后一步以后,所有的listener回调contest loaded,也就说我们这个环境已经准备好了。这个完以于是在它里边的最后一步回所有的listener。
12:12
他。回到它,它的什么呢?它的我们这个叫contest方法。的方法就是呢,它是在这一块给我们进行回调的,好,那这个回调完了以后呢,我们来往下。往下走,往下走好,我们这个prepare contest,那就算是完成了,我们控制台呢,把相当于相关的环境我们都准备好了,接下来就是我们这一块叫refresh contest,那这一块我们之前也都说过,这叫刷新环境。刷新容器。刷新容器。所谓的刷新容器就是IOC容器初始化的过程。这个初始化呀,那就是加载IC容器里边所有的组件,它来扫描我们所有的配置类,扫描我们所有的安特B等等,给我们创建对象初始化我们来可以step into进来,来我们这个re,我step into进来,Re呢就在下边,哎整个这个呢,我这就是我们IC容器的整个初始化过程,这个IOC容器的初始化过程呢,在我们spring的解版里边也有完整的解释。
13:31
主要呢是可以再看这一步,这一步叫finish鼻音啊,当纯引的时候,来这一块呢,就是来初始化剩下的所有单式利B,比如我们容器中所有的组件,那都可以在这儿创建完对象,好,那这个呢,我们就啊不用再看了,我呢就直接放行。好,只要它调完这个re contest,那我们IOC容器就算是创建完了,把这个我直接来放行,放到下一个断点,而且我们看控制台们也能看到,诶所有的这些组件B应都在控制台打印创建开也启动了,因为如果是web应用的话,我们之前也看到过web应用呢,在这一块还会创建嵌入式的tomcat。
14:17
啊,如果是外表。如果是应用还会创建嵌入式的,这就是我们这个rere conest刷新IC容器,C容器都创建完了以后呢,这有一个after rere方法来step头进来,After瑞里边呢,它主要有一个叫靠装的,我们来step进来,这个靠的呢,我们来看,诶它呢是get being of Type Contest,这个contest就是C容器,它相当从IOC容器中获取所有的application runner跟什么呢?Ner,这是我们之前说的要关注的几个事件监听的这两个组件,好,那我们相当于在这它是来从IOC容器中,诶注意啊,它可不是从spring factory这个配置中的,它是从IOC容器中获取所有的什么呢?啊,获取所有的。
15:20
叫application。啊不对,开始装的和我们这个command装的。考门的烂容呢,然后呢进行回调,而且呢,我们能看到这块的代码的写法。这个写法呢,还是先是来回调application application啊runner的也所有的application runner都调完以后才是command烂,那就是有优先级,哎,我们说一下啊,不开runner,哎,先回调。先回掉。哎,我们接下来呢,我们的烂装呢,再来毁掉,哎,人家这一块的判断直接都有了,有这个先后顺序再毁掉来,那相当于我们这两个东西,我们又知道,哎,它在何时运行了啊,那么我们after rere,相当于就是来调用这两个runner,这两个runner呢,我们就来往下放行,放行这个runner它都调完以后呢啊,After refresh就调完了,接下来就是有一个叫ER接,就是所有的这些再来调用所这个方。
16:40
好,那呢,在最后一步就是所有的李呢。回什么?那这样的话呢,我们整个spring boot应用就算是一步一步启动完了,哎,我们来放行放行放行,他把这个回调完,接下来呢,我们这个stopwa stop,哎,我们来保存我们当前应用状态,哎,它已经啊不用启动了,已经启动完成了,启动完成以后呢,还会给我们干嘛,返回我们这个IOC容器。
17:23
应用启动完成以后。返回我们这个启动的咱们这个IC器,IC容器里边也会有我们所有的组件,那这样我们所有的spring spring的所有启动流程就完了,而且呢,每一个我们这个listener在哪里回调,我们在这呢,都给大家标注好了,这就是我们spring boot的整个启动流程。核心呢就是两处,那么第一处呢,就是我们各种这个监定机制的使用,这两个呢,特别是这两个,这两个呢是需要配置的,哎,他们呢,我们先需要配置在咱们这个Meta。
18:07
F,我们这个这个配置文件中的三个里边的,而我们剩下这两个呢,我们从圆码里边呢,我们也看到这两个呢,它是只需要啊,加在LC容器中的啊,只需要。只需要放在IOC容器中的,包括呢,每一个这个事件都是什么时候回调啊,我们参照原文的位置就可以了,那么大家想要干预到什么时候,那就用相应的这个监听回调器就行了,那么第二处就是我们这个refre contest,那么说这一处呢,就是IC容器的刷新,所以刷新容器我们一直在说它其实啊就是扫描,哎,咱们这个创建包括呢,加载所有组件的,咱们这个地方这块呢,就是来扫描创建加载所有的组件,也就是说我们自动配置,像那些配置类啦,配置类包括我们这些组件啦,包括自动配置啦等等,他们这些都是在这儿啊,我们IC容器按照我们这些判断条件,或者按照什么给我们容器中加组件,都是在这一块完成的,好,那么下节课呢?我们就来尝试。
19:26
试一下我们这几个监听器的这个使用就行了。
我来说两句