SpringBoot的嵌入式Servlet容器自动配置原理2
SpringBoot的嵌入式Servlet容器自动配置原理1
这部分,我们主要是看一下SpringBoot中的例子。我们先在依赖中找到类作为例子
找到web模块下的EmbeddedWebServerFactoryCustomizerAutoConfiguration类:(旧版源码是EmbeddedServletContainerAutoConfiguration类 )
这个类也和旧版源码有挺大不同了,2.x中把自定嵌入式容器工厂的校验去掉了。
新的源代码已经改了,核心是如下几个。其实质就似乎在判断是哪种容器就创建一个什么容器。
接下来我们应该找的是:TomcatServletWebServerFactory.class
当中有一个getWebServer()方法
对这个类的介绍大致如下:
最后一步的return this.getTomcatWebServer(tomcat)是将配置好的tomcat传进去,返回一个嵌入式的tomcat。
我们可以找到这个方法.getTomcatWebServer
点进TomcatWebServer可以再详细看看
里面传了三个参数,有两个比较关键,分别是tomcat和autoStart。同时还需要注意 this.initialize() 点进去看看
而this.tomcat.start()则是最为关键的,tomcat在此就启动了。于是我们产生一个疑问:我们对嵌入式容器的配置修改是怎么生效?以前我们在配置自定义嵌入式容器时,是采用两种方式的
ServerProperties和EmbeddedServletContainerCustomizer
EmbeddedServletContainerCustomizer:定制器帮我们修改了Servlet容器的配置。那么它到底是怎么帮我们配置的呢?
答:在容器中导入了EmbeddedServletContainerCustomizerBeanPostProcessor(即后置处理器)
注意这两个类的命名是十分讲究的。那么属性文件又是怎么生效的呢?其实可以点击属性,进入后发现是个serverProperties绑定在一起了,而serverProperties也是嵌入式容器定制器。
因此我们可以串连起整个流程:
1)、SpringBoot根据导入的依赖情况,给容器中添加相应的EmbeddedServletContainerFactory以【TomcatEmbeddedServletContainerFactory】为例
2)一旦加进容器中,容器中某个组件要创建对象就会惊动后置处理器;EmbeddedServletContainerCustomizerBeanPostProcessor;
只要是嵌入式的Servlet容器工厂,后置处理器就工作;
3)、后置处理器的工作作用是,从容器中获取所有的EmbeddedServletContainerCustomizer,调用定制器的定制方法