好的,阿杰。下面是你所需的 第七章:Spring Boot 与 Apache Tomcat 集成机制的结构化大纲 + 内容。你可以用作文案模板,也可直接填充到你的项目文档中。我会包括 出站链接与参考资料,便于后续查验。


第七章:Tomcat 与 Spring Boot 集成机制

7.1 引言

在 Spring Boot 项目中,默认会集成一个 Web 容器,而 Tomcat 是最常用的选择。理解其集成机制,有助于你:

  • 明白 Spring Boot 如何 “开箱即用” 一个 Web 容器;
  • 在需要时切换容器(如 Jetty、Undertow)或部署为外部容器;
  • 自定义容器配置,如端口、线程、连接器等。

7.2 Spring Boot 默认嵌入式 Tomcat

  • Spring Boot 的 starter 依赖 spring-boot-starter-web 默认包含 spring-boot-starter-tomcat,也就是说:只要引入 web starter,就默认用 Tomcat。 (Home)
  • 启动 SpringBoot 应用时,会创建一个嵌入式的 TomcatServletWebServerFactory(在 Servlet 模式下)或 TomcatReactiveWebServerFactory(在 WebFlux/响应式模式下)来启动 Tomcat 实例。 (Home)
  • 你可以通过配置文件(application.propertiesapplication.yml)中的 server.portserver.servlet.context-pathserver.tomcat.* 等属性,来改变 Tomcat 的行为。 (Home)

7.3 集成流程解析

下面是 Spring Boot 与 Tomcat 集成的简化流程:

  1. SpringBoot 启动主类调用 SpringApplication.run(...),触发自动配置。
  2. SpringBoot 在类路径中检测到 Tomcat 的相关类(因为依赖中含 spring-boot-starter-tomcat),满足条件 @ConditionalOnClass(TomcatServletWebServerFactory.class) 等。
  3. 自动配置 ServletWebServerFactoryAutoConfiguration 中会创建 TomcatServletWebServerFactory bean。
  4. TomcatServletWebServerFactory 启动时,会实例化 org.apache.catalina.startup.Tomcat,设置端口、连接器、线程池、上下文路径等。
  5. 注册 Spring 的 DispatcherServlet、Filter、Listener 等到 Tomcat 上下文中。
  6. 应用运行在 Tomcat 容器中,对外暴露 HTTP 接口。

这种 “嵌入式容器 + 自动配置” 的机制,使得你几乎不需要手动配置即可运行 Web 应用。


7.4 部署方式:嵌入式 vs 外部 Tomcat

  • 嵌入式方式(默认):应用打包成可执行 JAR,内含 Tomcat,直接 java -jar 即可。优点:部署简单,自包含;缺点:若已有统一容器管理,可能不符合组织规范。
  • 外部 Tomcat 部署:你可以将 Spring Boot 应用打包为 WAR,部署到已有的 Tomcat 容器中。参考文章:如何将 Spring Boot 应用部署到 Tomcat。 (developer.okta.com)
    • 要支持 WAR 部署,需要继承 SpringBootServletInitializer 并覆盖 configure 方法。
    • pom.xmlbuild.gradle 中改变打包方式为 war,并去除内嵌 Tomcat(通过排除依赖)。
    • 根据组织环境,有时外部容器更易统一管理。

7.5 自定义 Tomcat 配置

Spring Boot 允许你通过很多方式来自定义 Tomcat。比如:

  • application.properties 配置 server.tomcat.max-threadsserver.tomcat.accesslog.enabledserver.tomcat.uri-encoding 等。
  • 编写一个 @Component 来实现 WebServerFactoryCustomizer<TomcatServletWebServerFactory>,在 customize() 方法中进行更底层配置。 (Home) @Component public class MyTomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { factory.setPort(9090); factory.addConnectorCustomizers(connector -> { connector.setAttribute("maxThreads", 200); }); } }
  • 若使用外部 Tomcat,还可以通过 context.xmlserver.xml 等传统方式配置。

7.6 注意事项与坑

  • 若你同时引入了其他容器(如 spring-boot-starter-jetty),需要通过排除 Tomcat 依赖,或设置优先级。 (Stack Overflow)
  • 部署 WAR 时,要确保 web.xml、Servlet API 版本、Tomcat 的兼容性正确。
  • 嵌入式 Tomcat 虽方便,但在企业运维中,有时对日志、监控、容器配置的控制不如外部部署灵活。
  • 在 SpringBoot 多模块或混合场景时,理解自动配置触发条件(@ConditionalOnClass 等)能帮你避免 “我以为用的是 Tomcat,实际上是 Jetty” 的错觉。 (Medium)

7.7 本章小结

  • Spring Boot 实现与 Tomcat 的集成,核心在于 “自动配置 + 嵌入式容器” 模型。
  • 默认情况下,通过 spring-boot-starter-web 引入 Tomcat,免安装、免外部容器即可运行。
  • 若有特殊需求(如部署为 WAR、使用已有容器、切换容器类型等),Spring Boot 提供灵活的替代方案。
  • 掌握自定义配置(properties + 自定义 bean)可以让你在项目中“拔高”对容器控制能力。

📚 参考资料