好的,阿杰。下面是你所需的 第七章: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.properties或application.yml)中的server.port、server.servlet.context-path、server.tomcat.*等属性,来改变 Tomcat 的行为。 (Home)
7.3 集成流程解析
下面是 Spring Boot 与 Tomcat 集成的简化流程:
- SpringBoot 启动主类调用
SpringApplication.run(...),触发自动配置。 - SpringBoot 在类路径中检测到 Tomcat 的相关类(因为依赖中含
spring-boot-starter-tomcat),满足条件@ConditionalOnClass(TomcatServletWebServerFactory.class)等。 - 自动配置
ServletWebServerFactoryAutoConfiguration中会创建TomcatServletWebServerFactorybean。 TomcatServletWebServerFactory启动时,会实例化org.apache.catalina.startup.Tomcat,设置端口、连接器、线程池、上下文路径等。- 注册 Spring 的
DispatcherServlet、Filter、Listener 等到 Tomcat 上下文中。 - 应用运行在 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.xml或build.gradle中改变打包方式为 war,并去除内嵌 Tomcat(通过排除依赖)。 - 根据组织环境,有时外部容器更易统一管理。
- 要支持 WAR 部署,需要继承
7.5 自定义 Tomcat 配置
Spring Boot 允许你通过很多方式来自定义 Tomcat。比如:
- 在
application.properties配置server.tomcat.max-threads、server.tomcat.accesslog.enabled、server.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.xml、server.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)可以让你在项目中“拔高”对容器控制能力。
📚 参考资料
- Spring Boot 官方文档 — How to Use Another Web Server(默认 Tomcat 部分) https://docs.spring.io/spring-boot/docs/3.2.3/reference/html/howto.html#howto-change-the-web-server (Home)
- “Spring Boot Embedded Server Mechanics Explained” — Medium 博文(流程解析) https://medium.com/@AlexanderObregon/spring-boot-embedded-server-mechanics-explained-8b01fe2bc5d8 (Medium)
- “Deploy a Spring Boot Application into Tomcat” — Okta 开发博客 https://developer.okta.com/blog/2019/04/16/spring-boot-tomcat (developer.okta.com)
发表回复