当前位置: 首页 > news >正文

Tomcat由浅入深:从零搭建Spring Boot内嵌Tomcat应用(附避坑指南)

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!


一、为什么我们要学 Tomcat?

在 Java Web 开发中,Tomcat 是最常用、最轻量的 Servlet 容器。它不仅能独立运行 Web 应用,还能被Spring Boot 内嵌使用,省去部署 WAR 包的繁琐步骤。

📌 真实需求场景

假设你正在开发一个后台管理系统,需要提供 RESTful 接口供前端调用。你不想花时间配置 Nginx + 外部 Tomcat,只想“写完代码直接运行”,那么 Spring Boot + 内嵌 Tomcat 就是你的最佳选择!


二、Tomcat 是什么?能干啥?

  • 本质:一个开源的Java HTTP 服务器 + Servlet 容器
  • 作用
    • 接收 HTTP 请求(如GET /api/user
    • 调用对应的 Java 类(Servlet 或 Controller)
    • 返回响应(JSON、HTML 等)
  • Spring Boot 默认内嵌 Tomcat,启动时自动启动 Web 服务

✅ 优势:无需单独安装 Tomcat,打包成 JAR 直接运行!


三、动手实战:用 Spring Boot 快速跑起一个内嵌 Tomcat 服务

1️⃣ 创建 Spring Boot 项目(Maven)

<!-- pom.xml --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> </parent> <dependencies> <!-- Web Starter 自动引入内嵌 Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

💡 注意:spring-boot-starter-web默认依赖tomcat-embed-core,无需额外配置!


2️⃣ 编写一个简单 Controller

// UserController.java package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @GetMapping("/hello") public String sayHello() { return "Hello from embedded Tomcat!"; } }

3️⃣ 启动主类

// DemoApplication.java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

4️⃣ 运行 & 测试

终端执行:

mvn spring-boot:run

浏览器访问:
👉 http://localhost:8080/hello

✅ 输出:Hello from embedded Tomcat!

🎉 恭喜!你已经成功运行了一个基于内嵌 Tomcat 的 Spring Boot 应用!


四、自定义 Tomcat 配置(端口、线程数等)

虽然默认配置够用,但生产环境常需调整。

✅ 正确做法:通过application.yml配置

# application.yml server: port: 9090 # 修改端口 tomcat: max-threads: 200 # 最大工作线程数 min-spare-threads: 10 # 最小空闲线程 connection-timeout: 5000 # 连接超时(毫秒)

🔍 原理:Spring Boot 会自动将这些配置注入到内嵌的 Tomcat 实例中。


五、反例警告 ❌ —— 新手常犯的错误

❌ 反例1:手动 new Tomcat 实例(完全没必要!)

// 错误示范!不要这样做! public class BadExample { public static void main(String[] args) throws Exception { Tomcat tomcat = new Tomcat(); tomcat.setPort(8080); // ... 手动添加 Context、Servlet... tomcat.start(); tomcat.getServer().await(); } }

⚠️ 问题:绕过 Spring Boot 自动配置,失去 AOP、事务、Bean 管理等核心能力!


❌ 反例2:在webapps目录放文件(内嵌模式不生效!)

很多教程教你在外部 Tomcat 的webapps放 WAR 包,但在Spring Boot 内嵌模式下,这个目录根本不存在

✅ 正确做法:所有资源通过 Spring 的@RestControllerstatic/目录提供。


❌ 反例3:试图修改server.xml(内嵌 Tomcat 没有这个文件!)

内嵌 Tomcat 的配置全部通过 Java 或 YAML 完成,没有conf/server.xml

若真需深度定制(如加 Valve),应通过TomcatServletWebServerFactory编程式配置。


六、高级技巧:如何替换内嵌 Tomcat?

虽然 Tomcat 是默认容器,但你也可以换成 Jetty 或 Undertow:

<!-- 排除 Tomcat,引入 Jetty --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>

💡 适用场景:微服务追求极致启动速度(Jetty 更轻量)


七、注意事项总结 ⚠️

事项说明
不要混用外部 Tomcat 和内嵌 TomcatSpring Boot 默认内嵌,除非明确要打 WAR 部署
静态资源放src/main/resources/static/不要试图模仿传统webapps结构
配置优先用application.yml而非硬编码或 XML
生产环境务必调优线程池默认max-threads=200,高并发需评估
日志看logs/spring.log或控制台内嵌 Tomcat 不生成catalina.out

八、结语

Tomcat 并不神秘——在 Spring Boot 时代,它只是一个“藏在背后的引擎”。你只需专注业务逻辑,剩下的交给框架!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

http://www.jsqmd.com/news/239321/

相关文章:

  • 基于SpringBoot的高校疫情防控web系统毕设
  • AI人体骨骼检测精度测试:不同光照条件下的表现对比
  • 惊艳!用腾讯混元模型实现的实时会议同传案例展示
  • 基于Matlab的音乐数字均衡器设计设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)
  • 基于SpringBoot的高校科研信息管理系统毕业设计
  • UDS协议基础概念图解说明:小白也能看懂的教程
  • 人脸识别打码一体化:AI卫士完整解决方案
  • AI骨骼关键点检测如何提升精度?33关节点定位调优实战
  • ES集群健康状态维护:运维日常检查操作指南
  • 【CMAQ 模型 UG_ch13】WRF-CMAQ 模型概述
  • 基于SpringBoot的高校竞赛管理系统毕业设计源码
  • 基于LCL型三相并网逆变器的准PR控制Simulink仿真代做(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)
  • Multisim下载后仿真运行卡顿?教学环境调优建议
  • Realtek音频驱动无法启动?操作指南详解
  • 从0开始学AI编程:IQuest-Coder-V1新手入门教程
  • MediaPipe Pose性能优化:毫秒级处理背后的算力适配逻辑
  • 单相二重化逆变电路(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)
  • 默认参数与解构赋值结合用法:操作指南
  • 提升设计效率:Multisim14与Ultiboard双向更新操作指南
  • MediaPipe Pose部署指南:WebUI开发与集成教程
  • Qwen3-4B-Instruct-2507避坑指南:Chainlit调用常见问题全解
  • MediaPipe姿态估计异常检测:非正常动作自动识别教程
  • 小白必看:用通义千问2.5-0.5B-Instruct实现JSON自动生成
  • IQuest-Coder-V1保姆级教程:从安装到代码生成全流程
  • CS5715:2.7V~26V宽输入,单节锂电池适用,最高36V输出,省掉电感电流检测电阻,软启动时间可调,异步升压DCDC控制器
  • HunyuanVideo-Foley效果展示:不同场景下音效生成质量评测
  • MediaPipe Hands实战案例:手部关键点检测详解
  • 减少布线成本:USB设备网络化的工厂改造案例
  • 我用 ModelEngine 做了个日报智能体,AI 写周报的速度快得离谱
  • 零经验拿下第一份大模型实习,笨办法全公开