00:00
好,前面呢,我们通过对spring boot启动过程的完整分析,其实呢想让大家知道spring boot整个启动过程中,我们有完整的时间监听机制,我们有各种各样的组件,比如我们这有application contest initialize application listener,这个组件呢,老师都用黄色的这个底色来标识,还有这个spring application runer,还有我们的这两个application runner command line runner,然后呢,而且这些组件还会有各个时机来进行介入,比如呢,我们这个RI的这个initialize会在这个时机接入,然后呢,我们的application run listener,它会在这儿呢,先调用starting方法,包括下边各种时机跟这些时机的调用,我呢都用蓝颜色来完成,那其实呢,如果我们想要自定义监控到我们spring boot整个启动过程,想要在整个启动过程的好多时刻,我们想要做一些事情,我们就可以自定义这些组件,这些组件呢,就是我们前面黄色标识的application count English initial listener run listener,还有commander line runner application runner就。
01:00
这几个关键组件来数一下数量一二。345好,那这些组件呢,我们接下来就来做一个统一测试,好,我们也来测试一个叫application contest initialize。那所有的这个测试呢,我都还是放在这个,我们就叫listener吧,就放在这个listener包里边,我们也不起那么多报名了啊,那第一个我们就叫my application contest initialize,我们也来实现application contest initial接口,我们也希望呢,我们能监控到各个环节,其中呢,有一个initialize啊,我们先放在这,这个呢,一旦被调用,我们可以来打印打印一下。Application application contentest initial的这个initial方法传递过来了,而且呢,此时给我们还传了IOC容器,我们还可以对IOC容器来做一些操作,好,这是我们第一个组件,第二个组件叫application Li呢?好,那接下来呢,再来准备一个。
02:02
我们就叫my application listener,然后呢,我们还是让他实现application listener接口。来直接好实现它所有的方法,这有一个叫on a vacation event,好如果呢,这个方法被调用了,那就来看他们的这个调用时机能不能感受到,然后呢,我们就来打印这个方法,同时呢,还会传入我们当前这个方法,调用以后呢,这是一个事件,这事件里边呢,就包含了我们调调用的时间戳等等各种这些event事件信息,好然后呢,再来接下来我们还有一个组件叫of,离开wrong,我们就继续接下来。在这儿。我们把这些组件呢,我们都自己定义过来,Employments spring application run listen,那这个run list呢里边呢,来点进来啊,它的这个里边呢,因为有很多的这个默认实现,所以呢,导致我们在这儿你可以不用写那么多,但是我们可以把这些的实现我都来加上。
03:02
Ctrl o,我们来选中ctrl o,我们把这些呢全部选中,点个OK,然后呢,把这个过期的那就不要了,然后这个这些东西呢,什么时候被调用都可以来out一下,先是application run listen,首先呢,它会调用starting。这个调用时机呢,我们在前面呢都有标识,大家可以再去复习一下c out,然后呢,我们在这我这儿呢都多复制几个好,那这过期方法我们就不要了。首先我们这个starting starting的这个调用时机,我们可以来看一下所有的这个application wrong listen starting呢,那就是在我们这个应用刚一开始运行,然后呢,我们只要拿到所有的这个容器,刚创建好我们这个上下文的基本信息以后,我们就开始调用starting,相当于我们这个应用准备开始启动了,那在这调用starting将下来呢,是环境准备完成,环境准备完成呢,那就是我们前在这一块,那在这预准备一些基础环境,这环境信息只要准备完成以后呢,你就会调用这一块的回调,然后呢,包括其他信息,那conest prepare的,那这就是IOC容器准备完成这块呢,还会给我们传入IOC容器,此时呢,只要IOC容器准备完成,我们就可以来操作IOC容器里边,我们可以给IOC容器里边注册组件,包括呢,我们来获取组件等等,包括加一些其他监听器,你都可以来做这些事,然后呢,还有我们的这个叫con loaded,我们整个IOC容器加载完成,而这个加载完成更准。
04:45
这完成不一样,准备完成LC容器的,这个准备完成是指我们刚把loc容器创建出来,而加载完成呢,是指的是我们这个LC容器,我们来看啊,这块呢,你创建出来,创建出来以后呢,我们接下来就会给你调用LC容器呢,已经加载了,那我们就会调用这个,你准备完我们就来加载了,然后还有一个started叫IOC容器启动,然C容器启动呢,必须等到我们整个IOC容器调用它的刷新方法,把容器里边所有组件全部呢,呃,创建完成以后,那才会监听器调用它的start的方法,所以呢,此时这一块船的IOC容器跟这块船的IOC容器都不一样,那这一块传的loc容器里边所有的组件都已经创建实力了,而这一块传的loc容器还没有创建实力,然后呢,接下来我们再下来看,还有我们的这个running试机,那running时机呢,就是我们整个IOC容器全部实例创建完成,全部都结束了以后,而且呢,我们所有的这个application run running。
05:45
这些runner都执行完了以后,我们整个应用程序没有任何异常,启动起来以后,我们才开始呢,调用它的这个running方法,然后呢,当然还有这个run方法啊,这个是runningner的,所以我们这个running方法呢,那就是我们程序完全在运行,我们在running,而我们任何时期有失败,我们叫fail,这就是我们感知了我们这些事件的实际,然后呢,我们把前三个重要的组件我们自定义了,那还可以自定义叫呃不里开装的command LA装。
06:13
来准备一下,就叫MY不开runner来实现不开runner这个接口,然后呢,这个接口我们来添加上未实现的方法。然后呢,接下来我们来c out输出,那么只要这个方法呢,运一运行,我们发现呢,它的这个wrong方法就运行了,而且呢,这个wrong方法呢,会给我们传入这个XX其实就是我们的这个命令行参数啊,我们可以不用管,然后呢,再来接下来我们还有一个组件叫command line run,所以这些核心组件呢,我们都可以在这自定义implementments command line把这个添加过来,那什么时候呢,它运行那s out可以输出一下,然后呢,我们去找wrong方法,好,我们在这呢定义了这些组件,而这些组件呢,想要生效,它们又是不一样的,怎么不一样呢?我们可以来看,那当前在创建spring application应用的时候,Application contextest initializer和application listener,包括呢,Spring application wrong listener,他们都是去spring factor里边找的,所以呢,我们现在得有这个文。
07:23
件,这个文件呢,是在我们类路径下有一个叫Meta info这个文件夹里边,这个文件夹里边呢,我们就来准备一个文件,这个文件叫spring factor里边。来进行配置。所以呢,我们来看前几个这个组件G12,包括我们的还有这个run Lia这三个组件,这三个组件呢,是要配置在配置文件中的,那配置文件中怎么配,可以来参照我们的spring factor,那么之前呢,已经看过的这些来我们来这个spring factor在哪?好,这是我们这个spring BOO的这个文件,来这是我们自己写的,来拿到这一块,所以呢,我们这个application contexttest,我们来看啊,第一个组件application contexttest initial,你就配application contexttest initial的值,那呢,它要加载哪些组件啊,我们一个杠,一个逗号,我们在这分割,所以我们在自己的这个文件里边,我们也来写上。
08:22
都关掉好,我把这一块呢全部删掉,大家注意我们的application contexttest initialize叫它,所以呢,我们希望整个呢,我们项目一启动,我们的引力数拉能生效,那么就配了,然后呢,包括我们的这个。那还有一个叫application listener,它也是配在factor里边的,所以我们来参照application listener,有没有一个叫application listener,就是它。CTRLC来配置,在我们这,这是application listener的权利名,而我们要生效的这个listener在这儿,Application listener复制过来,相当这个listen呢,其实就是我们这个listen的接口名,然后接下来还有我们的最后一个,最后一个叫spring application run listen呢,它也是去spring factory里边找的application run,好,我们把这个run的这个权利名拿过来。
09:21
Copy reference,我们配置在我们的spring factor里边,等于等于什么呢?我们的这个application,因为这三种组件呢,是在我们这个spring factory里边配置的,那还有这两个组件,大家看啊,获取容器中的application。Run和command line runner,所以呢,你只要在容器中有就行了,所以我们这两个组件我们只需要放到容器中,它呢也要放到容器中,这样我们项目一启动,所有的这些组件都能监控到了,包括这一块的所有的详细信息,其实都是参照spring boot feature我们这个高一特性里边。
10:01
在它这个特性里边,Spring application里边专门1.7章会来讲我们应用的整个事件与监听机制,所以我们整个应用在启动过程中会给我们来发出很多的事件,因为启动了,然后呢,环境准备好了,然后呢,我们这个上下文初始化完成了,准备完成了等等,已经完全启动了啊,又失败了等等这一堆这一堆的事件呢,就是通过啊我们之类前面的这些,我们说的这些各种的listener之类的来进行监听的,所以呢,我们看到了我们这一块呢,全写完了以后呢,我们来启动测试,看一下我们写的这些东西能不能在合适的时间生效。哎,我们发现呢,我们在这启动报错是我们的这个oblic wrong listener,他说我们的这个wrong listener spring OB wrong listener,我们的这个run listen呢有问题,有问题的原因我们可以来参照以前人家写的这个wrong listen呢,来看一下啊叫spring factor,人家写的这个wrong listen呢,有没有这个run listen呢,就是它这个run listen呢,他说我们这个run listen呢,不能初始化,我们这个run listener的这个接口不能初始化的这个原因是在这说no such是满的啊,没有这个方法,这个方法呢,它在这是隐匿,这相当于是我们这个listener的一个构造器,要传入spring application和这个一个数组,其实人家在这写这个run list呢的时候呢,人家在这有一个有参构造器,把这个复制过来,所以呢,我们这个run list呢,我们自己呢,必须写一个,只能有一个我们的小参构造器,这个my run呢,然后构造器里边会给我们传入这两个参数,其实这也就只是。
11:41
好,我们的这些run list呢,可以拿到我们当前spring application的信息,我们可以在任何时候,比如我们的这个环境准备好了,我们把当前应用的这些信息,我们可以给它保存起来,然后我们在这拿环境准备好了,我们还可以给修改当前应用的信息,所以呢,如果写起来就应该是这样子的,我们真的想要定制呢,那就是这样子的,然后呢,THIS2APPLICATION等于application,比如呢,我感兴趣在应用呢,一启动的时候,我来把呃开里边的东西呢,我们来设置一些,或者我设置一些它启动引导器,或者我加一些组件,或者啊设置一些版ner信息都可以,我在这呢,可以在这儿做一些设置,好现在重新来启动。
12:27
这就是我们通过自定义的一些这些组件来我们监控到整个spring BOO的完整过程,我们看到哎,我们所有的都调用了,我们的list呢,先on application event它的方法调用了,接下来是run呢,我们整个正在starting,然后呢,Run呢,我们环境准备好,然后接下来就是run呢,我们上下文准备好,然后接下来是run listen,我们整个上下文呢,已经加载,已经加载呢,那相当于我们这个IOC容器就OK了,那完了以后呢,接下来我们这个listen呢,还有其他的我们这command listen呢,不list呢,我们各个的这个run方法也调用完了,然后呢,接下来我们的run list呢,监测到我们应用呢正在运行,所以我们整个的这些监控时机都有,而这两个command line装的,以及我们的这个three application装的,如果你想让他们,诶不是是我们command line装的和application装的这两个呢,我们之前看到底层源码,你还可以按照order给它排序,哎,他先来执行。
13:22
然后呢,我们数字越大,我们的优先级越高,所以呢,我们可以让它先执行,它在执行,而他的这个使用场景呢,大家可能会未来再看怎么boot官方的一些实例DEMO的时候,官方呢,在应用一启动以后呢,他想测试一些东西,他呢就写了一个command曼的line装,想应用一启动以后呢,他会一次性调用调一个它,所以呢,我们一般想要在应用一启动的一次性做一个一次性事情,我们就可以来写它应用启动,启动做一个一次性事情,它跟我们的啊不对,开声装呢都是一样的,我们写哪个都可以,这就是我们整个事件监听的整个机制。
我来说两句