随笔 - 303  文章 - 0  评论 - 3  阅读 - 15万

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   池塘里洗澡的鸭子  阅读(2461)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示