SpringBoot的嵌入式Servlet容器自动配置原理2

SpringBoot的嵌入式Servlet容器自动配置原理1

这部分,我们主要是看一下SpringBoot中的例子。我们先在依赖中找到类作为例子

SpringBoot的嵌入式Servlet容器自动配置原理2

找到web模块下的EmbeddedWebServerFactoryCustomizerAutoConfiguration类:(旧版源码是EmbeddedServletContainerAutoConfiguration类   )

SpringBoot的嵌入式Servlet容器自动配置原理2

 

这个类也和旧版源码有挺大不同了,2.x中把自定嵌入式容器工厂的校验去掉了。

新的源代码已经改了,核心是如下几个。其实质就似乎在判断是哪种容器就创建一个什么容器。

SpringBoot的嵌入式Servlet容器自动配置原理2

SpringBoot的嵌入式Servlet容器自动配置原理2

 

SpringBoot的嵌入式Servlet容器自动配置原理2

 

SpringBoot的嵌入式Servlet容器自动配置原理2

接下来我们应该找的是:TomcatServletWebServerFactory.class

当中有一个getWebServer()方法

SpringBoot的嵌入式Servlet容器自动配置原理2

 

对这个类的介绍大致如下:

SpringBoot的嵌入式Servlet容器自动配置原理2

 

最后一步的return this.getTomcatWebServer(tomcat)是将配置好的tomcat传进去,返回一个嵌入式的tomcat。

我们可以找到这个方法.getTomcatWebServer

SpringBoot的嵌入式Servlet容器自动配置原理2

 

点进TomcatWebServer可以再详细看看

SpringBoot的嵌入式Servlet容器自动配置原理2

里面传了三个参数,有两个比较关键,分别是tomcat和autoStart。同时还需要注意  this.initialize() 点进去看看

SpringBoot的嵌入式Servlet容器自动配置原理2

而this.tomcat.start()则是最为关键的,tomcat在此就启动了。于是我们产生一个疑问:我们对嵌入式容器的配置修改是怎么生效?以前我们在配置自定义嵌入式容器时,是采用两种方式的

ServerProperties和EmbeddedServletContainerCustomizer

 

EmbeddedServletContainerCustomizer:定制器帮我们修改了Servlet容器的配置。那么它到底是怎么帮我们配置的呢?

答:在容器中导入了EmbeddedServletContainerCustomizerBeanPostProcessor(即后置处理器)

注意这两个类的命名是十分讲究的。那么属性文件又是怎么生效的呢?其实可以点击属性,进入后发现是个serverProperties绑定在一起了,而serverProperties也是嵌入式容器定制器。

 

因此我们可以串连起整个流程:

1)、SpringBoot根据导入的依赖情况,给容器中添加相应的EmbeddedServletContainerFactory以【TomcatEmbeddedServletContainerFactory】为例

2)一旦加进容器中,容器中某个组件要创建对象就会惊动后置处理器;EmbeddedServletContainerCustomizerBeanPostProcessor;

只要是嵌入式的Servlet容器工厂,后置处理器就工作;

3)、后置处理器的工作作用是,从容器中获取所有的EmbeddedServletContainerCustomizer,调用定制器的定制方法