Spring Boot Web开发之Tomcat自动配置
Spring Boot默认支持Tomcat/Jetty/Undertow作为底层容器。在之前实战相关的文章中,可以看到引入spring-boot-starter-web就默认使用tomcat容器,这是为什么呢?通过该starter的pom.xml文件(IDEA中可以使用“Ctrl+鼠标左键”进入并查看spring-boot-starter-web底层pom文件)可以得到答案:其引入的就是tomcat容器。
下面分三部分内容解析Tomcat容器配置
一、自动配置原理
关于自动配置的原理在Spring Boot自动配置原理已经有详细的描述,这里关注将容器自动配置与其他配置的不同点(为什么不同呢?因为tomcat就是容器本身吗?)。
1、自动配置的类
其不是直接与Tomcat相关的名称而是一个Server工厂自动配置类的方式(应该使用了工厂模式),Spring Boot底层默认支持三种容器,用户也可以通过自定义方式配置自己需要的容器。
2、打开该类代码:可以看到import了内嵌的三种容器。
其中提供的可配置参数类为@EnableConfigurationProperties注解的ServerProperties,具体可配置属性如下:
为何如以上两点处理,可以参考Dubbo SPI机制之一JDK中的SPI
进入EmbeddedTomcat类
进入TomcatServletWebServerFactory类中getWebServer方法
继续进入getTomcatWebServer等方法,直到调用tomcat初始化方法,start方法启动tomcat
实际启动是Tomcat类中的start方法:
而这个server,其定义为Server,查看接口UML,如下:
看到了Lifecycle是不是似曾相识,参考Spring生命周期管理之SmartLifecycle,LifecycleProcesso接口详述。也就是在初始化的过程中内置的tomcat容器启动了。
启动Spring Boot项目只有一处,那就是main方法。所以可以肯定是在run方法中调用了,跟踪run方法,可以分析出tomcat启动进程大致如下:
可以理解在spring的refresh方法中调用getWebServer方法,在Spring容器初始化时将Tomcat等容器自动注入并启动。
二、配置tomcat属性
注意属性配置类ServerProperties,通过application.properties可以配置server前缀的属性修改容器默认属性值。
如:
以上通过配置文件配置属性。除此以外还可以通过代码配置Tomcat属性,如下:
如果想直接配置Tomcat/Jetty/Undertow,则可以直接通过分别定义TomcatServletWebServerFactory、JettyServletWebServerFactory、UndertowServletWebServerFactory实现配置。以TomcatServletWebServerFactory为例,如下:
如果想通过代码的方式配置servlet容器,则可以注册一个实现了WebServerFactoryCustomizer接口的bean,如下: