00:00
好,前面呢,我们说了一下使用外部的容器的步骤,主要的核心呢,就是我们需要多写一个类,这个类呢是springbo initial LA的子类,在这个子类中呢,我们来重写这个confi方法,在我们这个confi方法里边呢,我们调用application build,哎,这个就是我们这个构建器调用共建器的source方法,然后呢,把我们t application注解标注的这个种类我们传入进来,我们这个BOO应用呢,随着外部服务器启动,那也就启动起来了,那么整个呢,启动原理是怎么样的呢?那这要说原理之前,我们先来回想两个,第一个呢是炸包的方式,如果我们是一个可执行的炸包,我们是直接来在这执行慢方法就行了,炸包的方式我们是执行S的主主方法。
01:00
主类的慢方法,然后呢,我们会执行的时候呢,我们之前都已经看过了嵌入式so容器的启动原理,我们在执行的时候呢,就会帮我们来创建LC容器,而特别是创建web应用的容器的过程中,就会帮我们来创建嵌入式的tomcat容器,所以呢,如果是炸包,我们是先来启动LC容器,然后呢容器。然后呢,再来创建啊。启动IOC容器的时候,再来创建咱们这个嵌入式的sol容器,哎,我们是这样的,也就说我们先是创建IOC容器,Loc容器,把我们嵌入式的solid容器带起来,而如果是以wa包的时候,它就不一样了,袜包呢,因为我们不能运行主方法了,我们是先要啊启动服务器,我们一启动这个他看的服务器以后呢,我们服务器然后帮我们来启动,然后服务器启动咱们这个spring应用。
02:11
Boot应用启动spring boot应用呢?然后boot应用启动了,才能我们启动我们这个IC容器,那么呢,现在相当于是服务器帮我们来启动BOO应用,而服务器为什么能启动spring应用,最核心的点就是我们这个spring引力收入拉小,那我们就来把它的这个原理我们来给大家剖析一下,要说起它,我们就得追溯到我们有一个so 3.0以后有一个规范。在我们serve let3.0里边呢,有一项规范,我们来可以看一下3.0的这个规范,相关的这个规范我在呢,咱们这个spring注解版的视频里边有做详细的介绍,大家呢可以去参照一下,而这个规范文档呢,我也发给大家,在这个课件里边文档来我发的是solid3.1规范,打开这个规范文档,我们主要呢看8.24这个章节有一个规范叫share libraries和runtimeability,比如呢我们这个。
03:20
共享库和运行时插件有这一来参照这一,这一里边呢,主要定义了一个规则,定义了一个什么规则呢?我们来看这一块规则的描述,这块的详细描述呢?哎,我们之前有做介绍,我就直接说了,它是呢,在我们这个应用启动的时候,会创建我们每一个JA包里边,我们这个so container引力时LA这个类的实例,我们来说这是它的第一个规则,那那这个服务器启动,服务器启动也就是我们这个应用启动。
04:00
Web应用启动,应用启动会创建,会创建我们当前web应用里边每一个每一个。往里面它的咱们这个实线类的实例会创建它的实例吧。创建他的咱们这个实力。会创建它的实例,而要创建这些实例,他呢得去一个地方找,比如他怎么知道我们这个炸包里边一这些类的实现有有哪些呢?他是呢,他说这个东西呀,必须绑定在这个目录下,就说我们这个类的实现,哎,我们。咱们这个container in initial的实现,放在咱们这个炸包的。
05:00
炸包的哪里呢?包的这个叫mef啊,Service这个也说这个文件夹。放在这个文件夹先夹下,而且呢,注意这个文件夹下呢,我们来看还必须有一个,咱们这个文件名字叫Java X so container说呢必须有一个。有一个名为这个的文件,那么这个文件的内容,这个文件的内容是什么呢?文件的内容,它这说的就是你这个文件内容就是来指向我们它的实现类,哎,这个文件的内容就是它的咱们这个实现类全类名。全类名主要呢,有这么一个规范,包括呢,我们来看还有一项这一块呢,还说我们有一个附加的功能,就是这个container initialz,我们还可以用handles这个注解。
06:08
哎,我们可以使用,哎。可以使用handles这个注解。还可以使用它,它的作用是什么呢?我们来看一下这个handle types注解啊,它的作用就是我们这个container in initial LA,我们可以导入一些我们感兴趣的这些类,哎,有就说呢,我们可以在容器,在我们这个应用启动的时候,启动的时候加载我们感兴趣的,感兴。去掉咱们这类,就结合这三个规则,我来给大家串一下。那么流程呢,我们就来写在这儿,那么这个流程的第一步啊,不像是炸包运行慢方法,我们第一步呢,首先我们来启动他m cat服务器,他们cat服务器里边加载了这个项目,所以呢,我们第一步启动Tom k,那么启动Tom cat以后呢,接下来就按照人家的规则啊,服务器一启动以后,我们这个应用一加载,它就会找每一个炸包里边他们的这些实现类来要创建实例的,在哪找呢?在每一个JA包的me in for service文件夹下这个文件里边,那我们就来找别的地方呢,我就不找了,这个文件呢,直接在web,也就是说我们spring mvc的这个web包里边有一个叫my in for service这个文件,诶,我们看到了,把这个路径呢,我复制过来。
07:46
好,也就是说呢,这一块的这个路径就是spring framework web模块。的web模块里边,模块里边,诶有这个文件,这个文件呢,我们来看一下,我来点开这个内容,这个文件的内容呢,就叫container initial LA,哎,这是这个文件的内容,相当于呢,我们在应用启动的时候,哎就要启动它。
08:24
那好,应用启动的时候呢,我们要创建它的这个实例对象,那我就点进来,而它呢,注意它有一个叫handle taps,而他在创建实例对象的时候呢,我们来看它的on start up方法就是调这个的,它是怎么创建呢?哎,它是这样子的,他呢把感兴趣的这个on start up传的这个第一个参数就是我们感兴趣的所有类,把这个所有类拿来,拿来了判断这个类是不是接口等等,不是接口它就在这干嘛呢?哎,New instance感兴趣的类就是由这些handle types标注的。
09:03
来说。将将。标注的所有这个类型的类。都传入到。Up方法的,我们这个参数里边啊,传入到on startup的这个set集合里边,好,那么他把我们感兴趣的这些类传到这个集合里边以后,他做的是什么事呢?他是为这些类,只要不是接口,不是抽象的来创建对象,哎,为这些。为这些哪些类呢?就是为这些,为这些这个类型的类创建实例。
10:03
创建实例。而且呢,创建完的实例,大家来看这块呢,实例在这创建完了,创建完了以后呢,每一个创建好的实例执行他们自己的,相当于每一个创建好的,接下来第四步。相当于呢,我们服务器启动会创建非常多的web application实例,然后呢,每一个。每一个web application initial都调用自己的,调用自己的什么方法呢?调用自己的unsar up来看,它是拿到所有的,哎,每一个呢,Web application initialize来调它的on up方法。那好,那重点就在于我们感兴趣的这个web application initialize是什么?我们来点进来web不开呢,它是一个接口,但是我来打开这个接口的实现。
11:02
好,这个实实实现呢,就有这么多,我把它截图过来。保存。这就是我们web application initial的实现。这个实线呢,我们来把这个图我们来插入进来,我们放在image下的,诶好,这是这个实线,那这个实线有什么猫腻啊,来看啊。我们这个initial,诶它下面有一个叫initial,这是什么?你看这就是我们自己写的这个,比如说呢,我们这个应用生成的时候,我们说必须写一个,而这个。这个就是web application也没收入来,相当于呢,我们这个类会被创建对象,哎,我说呢,相当于。
12:02
相当于相当于我们的咱们这个initial。的类会被创建对象并执行并执行啊,Start up方法。Up方法,那这样的话呢,那一定就是服务器启动的时候,我们这个类创建对象了,并执行on start up,而我们这个类呢,没有on start up,我们来看它的副位这个initial,它里边有on start up on start up里边呢,有一个核心就是创建跟容器诶。接下来呢?这就是第五、第六步,So initial实例。执行。执行on start up的时候会干嘛呢?会在这调一个叫创建root application,就是呢会创建容器,那么创建容器它是怎么做了,我们来看一下。
13:15
在这个创建容器的时候呢,哎,创建容器这个方法呢,就在下边创建容器呢,它前边先来创建一个应用的啊,这个构建器,我们把整个代码呢都复制来。创建容器的整个代码。我都复制来,复制来呢,我用Java方式,Java的方式,然后呢,我们来看那么它的这几步,关键几步,那么第一步就是创建spring应用的这个构建器,然后呢,再来创建一些环境,然后呢,Build啊慢也就说设置我们这个啊主类是哪个类等等等等,主要呢我们来看这儿,这有一个叫confi。
14:01
哎,调用con方法。调用config。而这个康菲格方法负类里边虽然有定义这个康菲格,但是这个菲格呢,只是来返回我们这个啊spring应用的构建器,而我们子类把con重写了,重写呢传入了spring应用的主程序,所以说呢,我们这个子类子类我们传入了。子类重写了这个方法。那这个方法相当于呢,就是我们在创建这个对象的时候,调的是我们这个con方法,然后呢,像我们boot的主程序类,主程序类传入了进来。然后呢,接下来我们能看到在这在这呢,所有都准备好以后,我们spring boot应用的构建器就帮我们来创建一个应用,使用build。
15:05
标的,创建一个spring。而这个创建的这个spring应用,来大家注意这创建完spring应用,在下边就帮我们干嘛呢,进行run,哎,Run呢。而这个wrong我们点进去,跟我们之前就是一模一样的效果,我们来看一下这个wrong我来点进去,哎,然后呢,我们这个spring application要运行起来了,你看这个run呢,就是我们之前说的这个方法,有这么一长串,包括这一块,诶这块呢,还刷新什么容器,如果有嵌入式的solid容器,我们之前还在这儿穿嵌入式的solid容器等等等等,所以呢,这就是我们spring应用就在这启动起来了。哎,那就是在这儿启动了spring应用。
16:00
创建容器第七步。Spring的应用的应用的应用。就启动了。并且呢,哎,创建并且创建咱们这个LC容器。所以呢,哎,这个呢,就是先来启动服务器,再来启动LC容器,那这个应用启动就是这个run方法,我们把这个run方法呢,给大家也复制过来。这就是我们之前看到应用启动的这个方法。好找,主要呢在这一步叫refresh,这一步呢是刷新。刷新IOC容器,比如说IOC容器的初始化好,那么整个的这个核心,其实说白了就是,哎,根据我们3.0标准,哎,我们在一服务器启动的时候呢,会加载spring boot initial LA的这个实现类实例,我们在这个实例里边呢,主要是来重写它的这个conig方法,用conig来告诉一下我们这个BOO的主程序在哪,这样应用一启动就知道我们spring的主程序在哪了,主程序在这,然后接下来呢,我们就相当于来帮我们来启动我们这个主程序,启动应用,这样的话呢,我们先来启动S容器,再来启动S的应用,哎,这就是一个跟它相反的操作,哎,先是启动solid容器。
17:40
再启动应用。好。
我来说两句