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,如下:

        
        
  以上是普通配置方式,也可以以Java Bean 的方式进行配置。
  SpringBoot提供了内嵌的Servlet容器,对于非内嵌Servlet容器的使用可以通过排除内嵌容器后切换Sevlet容器。具体操作参考Spring Boot Web开发之切换Servlet容器

  

posted on 2021-04-30 15:16  池塘里洗澡的鸭子  阅读(2450)  评论(0编辑  收藏  举报