简介
一般做Springboot项目,都是打成jar包,并且内嵌一个Servlet容器(Tomcat,jetty,undertow),今天就了解一下有关内嵌Servlet容器的自动装配(2.0.0版本),主要是两个类EmbeddedWebServerFactoryCustomizerAutoConfiguration和ServletWebServerFactoryAutoConfiguration
EmbeddedWebServerFactoryCustomizerAutoConfiguration
1 |
|
根据导入的依赖不同,会注册不同的WebServerFactoryCustomizer(容器工厂定制器),默认在spring-boot-starter-web中会依赖spring-boot-starter-tomcat,即默认使用的是Tomcat容器,如果想用其他的容器,就将默认的依赖删除,加入指定容器的依赖即可。就以TomcatWebServerFactoryCustomizer为例:
ServerProperties
1 | (prefix = "server", ignoreUnknownFields = true) |
从配置文件中读取属性值。
TomcatWebServerFactoryCustomizer
1 | public class TomcatWebServerFactoryCustomizer implements |
TomcatWebServerFactoryCustomizer 实现了 WebServerFactoryCustomizer接口,其中有一个customize方法,是根据ServerProperties(配置文件中的配置)给容器进行初始化,打个断点,观察一下方法调用栈。
发现是WebServerFactoryCustomizerBeanPostProcessor这个后置处理器中调用的
WebServerFactoryCustomizerBeanPostProcessor
1 | private void postProcessBeforeInitialization(WebServerFactory webServerFactory) { |
这里会获取所有的WebServerFactoryCustomizer,依次调用其中的customize方法。
WebServerFactoryCustomizer
这些都是WebServerFactoryCustomizer接口的实现类,可以发现其中的TomcatServletWebServerFactoryCustomizer,ServletWebServerFactoryCustomizer,TomcatWebServerFactoryCustomizer都是和Tomcat有关的。
- TomcatWebServerFactoryCustomizer 配置tomcat的主要信息,包含remoteIpValue、connector(最大/最小可接收线程、最大可接收头部大小等等)、uriEncoding、connectionTimeout、maxConnection等属性
- TomcatServletWebServerFactoryCustomizer 配置tomcat的额外信息,redirectContextRoot(是否在请求根上下文时转发,true则转发路径为/demoWeb/)和useRelativeRedirects(是否使用相对路径)等路径跳转问题处理
- ServletWebServerFactoryCustomizer 主要配置tomcat的servlet的信息,包含端口、上下文路径、应用名、Session配置、Servlet携带的初始变量等等
ServletWebServerFactoryAutoConfiguration
1 |
|
可以发现,ServletWebServerFactoryAutoConfiguration这个自动装配的类中注册了这两个容器工厂定制器。并且@import(BeanPostProcessorsRegistrar),其中注册了webServerFactoryCustomizerBeanPostProcessor这个后置处理器。
自定义webServerFactoryCustomizer
1 |
|
可以在自定义一个WebServerFactoryCustomizer,设置自定义的属性。
总结
springboot在启动时,会自动装配EmbeddedWebServerFactoryCustomizerAutoConfiguration和ServletWebServerFactoryAutoConfiguration。其中会有一些相关的Customizer(定制器),并注册了webServerFactoryCustomizerBeanPostProcessor后置处理器。然后在创建Servlet容器时,会在这个后置处理器中遍历这些定制器,完成对Servlet容器属性的设置。