00:00
好,接下来呢,我们来说一下第十小节,嵌入式solid容器对应的呢,也是spring boot官方文档的743这个章节,那就在我们的这个solid filter listener的下边,那嵌入式so容器给我们的第一印象就是我们来创建一个spring boot应用的时候,我们无需外置来部署服务器,我们应用里边呢已经自带了服务器,我们应用一启动,我们服务器呢,也算是启动就直接能用了,比如我们默认启动呢,就是他们开的,而它的这个原理是什么呢?Spring boot官方也在这说的非常清楚,说呢其实是spring boot它的启动期间用了一个非常特殊的loc容器,这个容器呢叫solid web server application contest,然如果spring BOO发现你当前是一个web应用的时候,Loc容器呢,就会变成solid select web server,不contest,我们可以来给大家看一下so so server,我们的这个叫so web server,翻译过来叫so的web。
01:00
服务器的这个LC容器,它呢也是一个loc容器,我们来点进来,再来点进来,再来一直点进来,我们来看到它呢,其实一直点进来就是一个application application context,这就是我们说的LC容器,就是当我们项目一启动以后,我们可以把这个原理呢给大家串一下,这一块的实用性价值可能不是很高,但是整个的这个原理呢,是那么这个spring boot应用,Spring boot应用启动,启动发现当前是web应用,因为我们导了web的这个场景包,Web的场景包里边呢有tomca web场景包,然后呢也导入了tomcat,导入了tomcat,所以呢B发现我们是web应用,然后呢,Web应用它就会创建一个web容器,呃,应用会创建一个web的,Web版的LC容器会创建一个web版的LC容器。
02:00
而这个容器的名字呢,就叫,哎,我们来看官方文档,它说就叫solid select web server application conest,而这个容器呢,它想要干什么,我们可以来看一下,比就说呢,我们的这个容器它呢会在我们这个项目一启动的时候,我们来看啊,它说我们这个容器呢,是一个特殊的web容器,然后呢,它在会我们这个项目一启动引导过程中会search,后来搜索我们一个单个的叫select web server factory,哎,我们翻译一下呢,它就会在启动的时候时候,我们这个寻找们称为叫so web server factory,我们翻译过来就叫so的web服务器工厂,好来把这一块呢也给大家翻译过来,叫我们这个so web服务器工厂,Solid的咱们这个web服务器。工厂,那既然是工厂,这个工厂呢,我们猜这个工厂呢,它一定生产的产品就是solidle的web服务器,因为它是solid web服务器工厂,那它一定就会生产这个产品,好,那我们这个原理呢,探索到这,那它的这个工厂能生产出哪些产品呢?我们可以来看一下啊,来到我们这个官方文档,他说呢,我们这个工厂啊,他。
03:22
经常性它呢会使用这三种工厂叫tomca solid web factory,接体solid web factory或者on the top,我们的这个solid web factor,就是呢,我们这个web factor的工厂有很多,比如说我们spring默认支持spring boot底层默认有很多的web工厂。Web server工厂有我们的web服务器工厂,比如他举了这么几个例子,那我们正好来看一下是不是这样子的,我们因为我们web服务器要能自动配置,我们可以来到它的这个自动配置包,来到它的这个web场景下。
04:00
关于对服务器的自动配置,来到这个web场景找一下,看有没有关于服务器的,这有一个我们这个solid so里边呢,其中我们来看一下啊,就有一个叫so web server factory的auto configuration,比如说呢,因为我们这个spring boot1启动要找这些外这些server light web server factory,但是呢,这些web factory也不用我们配,因为我们底层呢,都只有直接有,底层直接会有一个会有一个自动配置类,这个自动配置类呢,就叫solid。我们的web server factor的auto con相当于什么BOO,底层给我们已经配置好了这些web服务器的工厂,那这些web服务器工厂能产生哪些web服务器呢?来一看一下啊,比如我们这个web服务器工厂里边,我们看到呢,它at,并给容器中导了一些这些组件,其实这一块呢,我们暂时不用分析,到这我们要看这,我们再来这个我们的自动配置类要生效,它呢,Import相当于前置,还导了一些这些,所以呢,我们的这个自动配置类它导了叫solid web server factory的configuration。
05:18
会有一个这个自动配置类,然后呢,这个自动配置类导入了,导入了它我们叫solid select web工厂的自动配置类,导入了solid web工厂的配置,这是那sole web工厂的这个配置类,它导了这个配置类,而这个配置类呢,它又干了什么?我们来看一下啊,这个复制到这这个配置类,配置类我们来点进来看一下,这个配置类呢,点进来我们会发现an being应给容器中放什么?放一个叫tomcat web factory,然后呢,又ATT being,放一个叫J体solid web factory,又ATT being放一个under to web function,那under to,包括我们这个阶梯,包括tomca,这都是我们常用的web服务器,所以呢,正印证了我们官方说的这一句话,我们的这个web IOC容器一启动的时候,它呢会寻找我们这个web工厂,这个工厂呢,底层给我们自动配置了这三个工厂,而且呢,这三个工厂大家注意它是条件配置,看第一个叫conditional on class,如果你的整个系统里边有这个类,有什么类呢?你有sot,有tomcat,什么时候有tomcat,我们来点进来,相当于呢,你倒了这个tomcat包,你肯定才会有tomcat,你看这是阿帕奇cat。
06:40
没问题,所以呢,也就是说你如果当前项目下默认你导了tomcat的依赖,那我们就给你容器中放一个tomcat的服务器创建工程,而且呢,如果你倒了,大家看啊,接下来呢,还会有一个类叫server,而这个server类又是谁的类呢?大家来看啊,这个server类它呢其实是阶梯的,也就说如果你的整个系统里边导的不是他们开的,而导的是阶梯的相关炸包,那就会有这个类,有这个类呢,我们就会给你放一个阶梯的我们的服器工厂,如果呢,你倒了on套这些包,那就会给你放一个on套的服务器工厂,所以呢,再是一句话,它呢也是动态这个配置类,根据动态判断,根据根据咱们这个动态判断,系统中,系统中到底导入了导入了哪个web服务器,服务器导包,而我们现在呢,默认是导了它。
07:40
不,K的包默认是导入Tom k的包,因为这这是我们这个web start导的,我默认我们这个web场景导入的是Tom k的包,默认web start导入Tom KT的包,所以呢,我们自然会给导入,那自然呢,我们会给容器中放一个tomcat的web服务器工厂,所以呢,我们现在容器中就有。
08:09
就有一个我们称为叫Tom k的web服务器工厂,而tomcat的web服务器工厂它又能干什么,就有他啊,就有他啊,所以呢,也就是说呢,他最终会给我们创建出他不开的服务器,他创建出他不开的服务器并启动,所以呢,我们也能追踪到这个过程,因为我们是这个s web server application contextest,那如果我们当前是web应用,我们就会创建一个这个web应用的这个IOC容器,这IOC容器呢,在一启动的时候,大家会看到这有一个web server,它呢就拿到,如果我们有异常,这个web server呢,就开始干嘛,就直接给它抛,呃,这个异常捕货到就直接停了,否则呢,我们来看啊,On refresh也是,我们容器一启动呢,都会调用这个方法,我们这个LC容器呢,它只有一个方法,就是创建web的服务器,而创建web服务器呢,点进来。
09:10
我们可以给这儿打个断点,我们来看一下它的整个流程,是不是如spring官方所说,我们呢,这是我们的这个IOC容器啊,没问题,我们这个IOC容器一启动,一启动呢,它接下来就会帮我们来要准备一个web服务器,这web服务器呢,默认时空,默认时空以后呢,接下来它怎么办?它在这呢叫create web server,相当要它要创建一个咱们这个呃web服务器,当然我们现在要创建的这个we web服务器呢,是通过什么创建的,大家注意它有一个方法叫get web server factory step into进来你就会发现它是get b names for type,它去IOC容器中找我们叫select web server factory这个组件,而且可能有多个,比说呢,即使你找到了是多个,大家注意啊,如果呢是零没有找到,它会给你抛异常,说们当前项目里边呢,没有web的这个服务器工厂,如果呢大于一个它呢也会抛。
10:10
异常说我们这个,呃,工厂呢,可能太多,但是呢,我们需要的是正好呢,我们的这个web服务器工厂就是我们记录的它有一个叫web server,我们的这个web server factory。它对,它会寻找他正好呢,我们会有这么一个,呃,So web server来看啊,它去LC容器中找serve web server factory找他这个呢,我们来直接给它放行,它肯定呢能找到,能找到的是谁?就是我们自动配置类里边给我们放了一个叫tomcat s web server factory,因为我们刚分析到这,我们专门呢有一个这个自动配置类,这个自动配置类呢,导入了工厂的配置,这个工厂的配置里边我们放了tomcat web server factory,放了它以后呢,我们来看到现在呢,我们的web服务器工厂我们就拿到了,那web服务器工厂一拿到就会调用web服务器工厂的get web server方法给我们把web服务器拿来,所以我们来step into看一下啊。
11:16
Step into怎么获取到我们的web服务器,大家看,其实呢,相当于我们以前外置服务器是我们双击tomca start up,然后呢,Tomcat慢慢启动,而我们内嵌服务器呢,相当于掉了一个方法把tomcat new出来,然后呢,把它的这些连接器,该监听的端口都准备好,所有的东西都准备好,就是以前我们。双击要做的工作,我们只不过是拿代码实现过来了而已,大家看啊,这都是来准备连接器,我们用HTP协议准备来接受请求的,所有我们的tomcad里边的连接器,Service服务,包括host这些呢,都给我们配好,包括我们的mcad引擎也都准备好,准备好以后呢,完全完成以后,给我们把他开的外包服务器反馈,所以其实一句话,内嵌服务器呢,倒没有多深奥的技术,所谓的内嵌服务器就是,然后呢,手动把启动服务器的代码一调用就行了,启动服务器的代码调用,当然你想要调用启动服务器的代码,你前提肯定是这个服务器的炸包一定得存在,哎,我们这个tomcat的核心炸包,Tom k的核心炸包存在,我们才能启动tomcad,所以呢,这就是我们说的内嵌服务器的整个流程,那我们现在呢,整个tomcad给我们一返。
12:42
回以后我们可以看一下啊,这个方法,只要web服务器一返回,那我们这一块呢,就全部结束,我们的web服务器就出来了,那web服务器一出来以后呢,那自然而然我们接下来要做的事情就是启动tomca的,所以呢,我们只要这个web服务器一啊一上来,而且大家会看到我们之前的这一块方法,这一块方法,我们把这一块方法给大家打开,我们在这呢,是拗了一个汤姆CAD,那我们这个汤姆K呢,只要一扭以后,那我们最终呢,会给我们返回一个这个东西叫叫叫叫我们的这个web server。
13:21
就是我们的这个web server吧,我们来看一下啊,好,就是这个web server,这个web server,而这个web server呢,我们这就会有start方法,它呢就定义了web服务器该怎么启动,我们来点开,点开它的实现,我们呢,现在是Tom k web服务器,所以大家看啊,我们这个底层的springb,底层默认支持呢,你用这几个web服务器。你如果想切换呢,你可以切换为阶TY nety tomcat,或者on to我们这几个web服务器,而我们现在呢,因为准备的是tomcat,所以我们来点进来,因为我们创建的是tomt服务器,只要这个tomcat服务器呢,一创建大家注意啊,我们来看啊,因为我们返回的是tomcat web server,所以呢,只要我们这个web server1返回,我们这个web server1返回,大家看我们这个web server11返回,因为我们的这个有参构造器,它在这呢就会调用,我们最终在这来记录一下。
14:25
会创建出汤姆cat的服务器,就是这个服务器,然后呢,这个服务器的构造器,它的这个构造器里边呢,直接会有一个叫initial lie初始化方法的构造器,拥有初始化方法,拥有初始化方法。哎,我们这个字打的不见了,我们稍等一下啊,拥有初始画方法,拥有初始化方法,所以呢,我们现在看到的效果就是它的这个初始化方法,在默认一初始化的时候,就会给我们干这件事,初始化方法大家看啊,准备好所有的东西,啥都准备好,把我们的tomcat调用一个start,所以呢,Tomcat服务器就启动了,这就是我们整个底层的这个原理那。
15:21
到这呢,我们就先来看第一个我们的应用,如果我想要切换我们的这个web服务器怎么办?我不想用tomca了,我想用on套或者阶梯,而且on套呢,默认不支持GSP,大家也应该知道一下,然后呢,我们可想切换其他的服务器怎么办?我们可以来到这,我们来参照spring boot官方文档,Boot官方文档我们来就using spring boot这一块呢,有start,所有的这个场景启动器,那么这个start里边我们看有没有跟服web服务器有关的,因为我们之前的服务器呢,我们用的是tomcat,然后呢,大家看有start tomcat,注意还有start on the top,还有start阶梯,所以我们想要切换什么服务器,我们就把它的这个场景启动器拿来,CTRLC正好说到这个原理,我们来看一下啊,而这个服务器呢,又是谁导入进来的?
16:12
是我们的这个web场景导入进来的,大家看啊,我们这这个start web,它的这个场景呢,帮我们导了start tomcat,所以呢,如果我们想要切换服务器非常简单,首先呢,我们导的start web场景,我们让它排除tomcat的依赖,首先好,我们把这个停了重新来写,首先呢你得排除排除谁,因为你现在呢导了tomcat,我们把这个开启自动导入把这你把tomcat呢,默认的是tomcat的场景,你导进来了,所以我让你排除tomcat场景,而同时加入什么场景呢?好,我们这要排除很多,那来写,要排除某个,我们把这某一个拿过来,好,我们首先呢排除一个,他们看场景,而我现在呢要用其他服务器,那我们就把其他服务器的场景,比如on套拿过来,CTRLC复制到这,然后呢,我们来导入进来就行了,走那我们的这个group ID。
17:12
还是这一块没问题,而且呢,我们也不用写版本,那STEM boot自动给我们仲裁和版本,如果是这种情况下呢,我们只要项目一启动,那我们的服务器用的就不是他们KD用的是on套,我们可以把我们这一块呢刷新一下,保证我们这一块的导入都是正确的啊,On套刷新一下。好,我们发现呢,我们under po的这个start的这个场景,它没有这个引入进来,我们来确认一下,我们这个场景呢,没有引引入进来,那我们自己还得写版本,我们就来写一个version吧,来看一下这个version呢会有哪些。在官方文档里边,诶,我们这儿呢,只有这么一个,只有这么一个场景,我们来找一下它的版本,那呢,没有写像这些starter肯定是自动仲裁的,来看一下我们这个版本是不是哪写错了,好,我们这多了个前克号,我们把这个前括号去了啊好,那现在呢,我们把我们的这个under to,我们来导进来,来重新刷新一下。
18:16
好,现在我们这个版本呢,240进来我们的这个on套,我们240,所以这一块呢,导的都是按套的这些炸包,那如果我们此时来启动我们的这个服务器。我们来看一下,现在呢,还用Tom k吗?来启动看一下啊。好,我们发现呢,这一块就提示,哎,我们现在呢是on套,我们的这个东西在8080端口启动了,当然我们整个应用呢还是可以使用,所以呢,这就是我们这个切换别的服务器,当然我们这个场景呢,用的不是很多,因为毕竟从我们的这个知识程度来看,我们对整个Tom cat的了解的深度肯定要优于二套,所以呢,我们也建议我们这个生产环境呢,默认来使用tomcat,我们想要优化呢,我们优化tomcat可能要比优化一个陌生的服务器要容易的多,好这是我们说的我们的这个切换服务器这一块拿过来我们放到这个里边。
19:25
其实切换这个原理呢,也非常简单,我们之前都已经分析过了,因为人家有一个服务器的自动配置类,就是我们的这个叫solid webs server factory的auto configuration,这个自动配置类里边呢,导了一个配置类,就是我们web工厂的web服务器工厂的配置类,这个配置类呢是动态根据条件导入的,所以呢,现在的动态条件呢,就变成了我们系统里边没有tomcat了,所以呢,我们看到我们现在整个系统里边tomcat就是发红的,而我们现在呢,有了安套,安套的这一类就是OK的,所以我们这一块呢就可以使用没有任何问题。
20:03
如果我们想要对服务器里边的规则要进行一些定制,哎,比如我们现在呢,默认啊使用的他mca的服务器或者什么服务器,我们想要改变它的端口,改变它的字符编码等等等等,那怎么办?那我们官方呢也说的很清楚,我们来到spring boot官方文档。其实我们不看文档,懂了自动配置原理,想要定制我们也也会非常容易,我们来到开发web应用里边,好,这是嵌入式solid容器,那我们想要定制呢,就可以来这么来做来看,首先第一个我们所有的这个配置都是在server啊这里边,所以我们想要定制呢,那第一种定制就是修改配置文件,直接修改修改server旗下的,为什么能修改server旗下的,那就来了来看一下啊,因为呢,我们这个呢,Server let web server的这个factory,这个factory呢,它里边呢,想要用到一些东西,我们来看一下这个自动配置类啊,大家看我们的这个跟web server factory有关的这个自动配置类,它绑定的这个配置文件叫server properties,所以呢,好多东西它的取值来源都是来源于server properties,包括我们来到这个嵌入式的这个Tom里边,嵌入式的这个tomcat里边,我们来看啊,它这来。
21:21
准备好这些工厂,工厂在创建东西的时候呢?工厂在创建东西的时候,最终会有一个工厂的定制化器,会根据我们的这个server properties里边的配置,最终改变我们要给我们的服务器给哪些值,而server properties呢,绑定的是以server为开头的,所以呢,我们所有的这个定制,第一个呢是修改配置文件,我们只需要修改server叉叉叉下边的,那有些同学说我一会切成tomcat了,一会切成on套了,那server下边有这么多的改法吗?你看server下边呢,既能改端口号,也能给我们这个地址,包括我们来改错误页面的这个映射属性,包括我们看下边我们可以来配置我们相关的安全链接,相关的信息,以及我们solid有关的通用信息,还有我们的,如果我们是这几种服务器,Tomcatty on the top,我们就来配这几种,所以呢,比如我们现在是under the top,那我对于我们的配置就应该是这样子的serve下边,那自然呢,我们会有一个under top,那我们under top的比如它的log,它的仿。
22:26
访问日志能放在哪啊,我们可以来放在我们这个当前的这个temp临时目录下,所以呢,这就是我们的这个配置,我们所有的配置呢,肯定都可以几乎由我们的配置文件来修改,这是第一个,那第二个我们要自定义的办法就更衰了,因为我们呢看到它是在容器中找一个叫select web server factory来我们来看啊,我们的这个应用启动呢,会找一个select web server factory,由这个factory最终给我们创建出web容器,Web容器再启动,所以呢,你想要直接修改底层的创建启动逻辑,你修改它更帅,叫web server factory,所以呢,我们可以直接来自己给容器中放一个so web server factory,而我们自己要放呢,我们推荐放这个叫conflict reb,我们的so web sor factory,因为我们来看一下啊,我们的这个so web sor factory,它呢?
23:26
是一个顶级的接口来CTRLH,我们用它下一级的,那里边的好多东西我们就能设置,我们来设置一些session的规则,设置一些什么东西,所以呢,如果我们想要定制我们的solidl web容器工程,那我们就直接在容器中放一个它就行了,所以呢,这是我们说的第二种办法,包括呢,官方文档也有说,诶你可以给容器中放一个你自己的web服务器的这个生成工厂,比如呢,你是一个tomcat的这个web工厂,把工厂里边的一些属性定义好,你把这个工厂一返回我们spring boot底层,就会调用这个工厂,创建出他们开的服务器,让我们来使用,这是我们第二种定制办法,当然第三种定制定制办法使用人家的这个东西叫。
24:10
Factor customer我们来看一下啊,因为我们在这一块来进行自动配置的时候,自动配置的候,我们还是打开我们这个自动配置类,在这个自动配置类里边呢,人家还会给容器中放一个叫sole web容器工厂的定制化器,这个定制化器呢,就是我们容器工厂准备好了以后,这个定制化器能后置的再来修改一下我们这个工厂里边的相关信息,所以呢,在这个定制化器里边,比如customers里边,我们所有的信息它都会从这个server properties里边拿到,最终呢跟工厂里边的东西一绑定,所以大家注意啊,我们这呢有一个定制化器,这个定制化器的作用就是把我们之前的工厂拿来,把我们配置文件里边的东西,然map里边找到配置文件里边的东西,绑定到工厂里边相应的这个里边,所以呢,我们这个custom它呢又是。
25:04
诶,就是它就是在这,它的这个作用呢,就是把配置文件,把配置文件的值和我们这个工厂绑定,和我们的这个叫so web server factory,这个里边相关的属性进行绑定,和它进行绑定,当然也可以给那打个断点,所以呢,我们也可以直接写一个自定义的这个customer,哎,我们写一个这个定制化器,这个呢也是在spring的底层,它是一种模式,如果我们大家经常会遇见叉叉,叉叉什么customer,那大家呢,就可以想象的是,我只要给容器中放一个这个我们称为定制化器,那我们就可以改变某些东西的默认行为,这就是我们spring的又一个又一种设计规则,他们呢,都是一些定制化器,可以改变相叉叉。
26:04
叉的默认规则,所以这就是我们说的定制,当然我们官方文档在这一块,我们这种的使用,我们把这个custom直接给容器中一放,反正你这个组件名字随便叫,然后呢,你在这个定制化方法里边,你可以修改我们刚才创建的这个web server工厂的里边的相关属性,比如它的端口号是什么,它session该怎么管理等等,以及大堆所有的属性呢,都能在这改,但是呢,我们还是推荐,因为所有的东西呢,都是跟配置文件绑定的,我们直接修改配置文件里边相关的,比如我们修改配置文件里边跟我们这个session有关的,我们session该如何管理,我们session的超时时间,默认30分钟们可以给它改成,我们可以改成一个60分钟,所以呢,所有的东西我们都可以通过配置文件来进行修改,这就是我们说的我们嵌入式容器的原理,以及它的定制化修改。
我来说两句