手写Tomcat原理整理
一、启动阶段Tomcat 启动的时候主要做一件事把所有的 Servlet 找出来实例化然后存到容器里。具体分为六个步骤第1步扫描目录Tomcat 启动后首先会扫描 webapp 目录下的所有子目录和子文件把里面所有的 .class 文件都筛选出来。第2步获取全类名拿到每个 .class 文件后获取它的全路径名也就是包名加类名比如 com.example.MyServlet。第3步反射加载拿到全类名之后调用 Class.forName(全类名) 这个方法。这里用的是反射机制。为什么要用反射而不是直接 new 呢因为 Tomcat 的开发者在写框架的时候根本不知道使用者将来会写什么 Servlet类名叫什么在哪个包里。new 的前提是编译时必须知道类名所以这里只能通过反射在运行时动态加载类。第4步注解筛选拿到所有 Class 对象之后遍历每一个 Class 对象检查它上面有没有 WebServlet 注解。带这个注解的类才是我们要管理的 Servlet。注解里面还包含了 Servlet 的访问路径比如 WebServlet(/login)。第5步创建实例对筛选出来的 Servlet 类调用 newInstance() 方法创建实例。newInstance() 和 new 的区别在于new 是编译时确定类名而 newInstance() 是运行时通过 Class 对象动态创建它只能调用无参构造器。第6步构建容器实例创建好之后再通过反射获取这个 Servlet 类里的 doGet 和 doPost 方法对象Method。然后我们构建两个 HashMap第一个存 Servlet 实例key 是 WebServlet 注解里的路径value 是 Servlet 实例对象第二个存方法key 同样是路径value 是 doGet 或 doPost 的 Method 对象这样启动阶段就完成了。总结一下就是扫目录 → 筛类文件 → 反射加载 → 注解筛选 → 实例化 → 存 HashMap。二、请求处理阶段启动完成之后Tomcat 就进入运行状态开始接收和处理 HTTP 请求。整个处理流程也是八个步骤第1步Socket 监听端口Tomcat 通过 Socket 监听 8080 端口。这里要注意源码中的 Socket 不是 Java 标准库的普通 Socket而是用了 Netty 框架的 Socket因为 Netty 性能更高支持异步事件驱动。第2步请求放入线程池队列当一个 HTTP 请求到来时Tomcat 不会立即创建新线程来处理而是先把这个请求放到线程池的任务队列里。为什么要这么做呢有两个原因第一防止内存耗尽。 如果瞬间来上千个请求每个请求都开一个新线程每个 Java 线程默认栈空间是 1MB1000 个线程就是 1GB 内存很容易 OOM 导致服务器死机。线程池有最大线程数限制超出的请求在队列里等着队列满了还有饱和策略直接拒绝保护服务器不宕机。第二减少线程创建销毁的开销。 线程的创建和销毁调用的是操作系统的本地方法涉及栈空间的申请和回收这个开销是毫秒级的。高并发场景下频繁创建销毁线程的开销会非常大。线程池里的线程在 run() 方法里有一个死循环会不断从队列里取任务线程不会销毁实现了线程复用。第3步线程池分配线程处理线程池里的空闲线程会从任务队列中取出一个请求来处理。第4步封装 Request 和 Response 对象线程拿到请求后首先把通过端口传过来的 HTTP 字符流进行解析封装成 HttpRequest 对象和 HttpResponse 对象。同时从 URL 中提取出请求路径去掉 IP、端口号和项目名称剩下的就是真正的资源访问路径。第5步判断请求类型拿到路径之后判断这个请求是要访问静态资源还是访问 Servlet如果是静态资源CSS、JS、图片、HTML 等就按路径去对应的目录下找文件按相应的编码读取内容直接返回给前端。如果是Servlet 请求就用这个路径作为 key去启动阶段构建的两个 HashMap 里查找。第6步匹配 Servlet 实例和方法从第一个 HashMap 里取出 Servlet 实例从第二个 HashMap 里取出对应的 Method 对象doGet 或 doPost根据请求方式判断。第7步动态代理调用方法拿到实例和方法之后调用 method.invoke(servletInstance, request, response) 来执行 Servlet 的业务方法。这里用的是动态代理。为什么要用代理呢因为编译时我们不知道具体的 Servlet 类名没办法直接写 servlet.doGet(req, resp)。但 invoke() 的三要素和普通方法调用是完全对应的第一个参数是对象实例在哪个对象上调用后面的参数是方法参数。所以本质上和直接调用是一样的只是通过反射动态完成。doGet 和 doPost 都是 void 方法没有返回值它们的处理结果会写到 response 对象里。第8步返回响应最后通过 Socket 的输出流把 response 对象里封装的数据返回给客户端。一次请求处理就完成了。三、总结所以手写 Tomcat 的核心就是启动阶段扫描 → 反射 → 注解 → 实例化 → 存 HashMap请求阶段Socket 接收 → 线程池处理 → 封装 Request/Response → 判断静态资源还是 Servlet → HashMap 匹配 → invoke 调用 → 返回响应而支撑这一切的三大核心技术就是反射、线程池、动态代理。这也是几乎所有 Java 框架的通用模式。

相关新闻

华为MetaERP 一、SLA 设计哲学SLA(Subledger Accounting)是所有子模块到 GL 之间的会计转换引擎,不是记账工具。业财分离 OM/INV/AR 只抛“业务事件“,

华为MetaERP 一、SLA 设计哲学SLA(Subledger Accounting)是所有子模块到 GL 之间的会计转换引擎,不是记账工具。业财分离 OM/INV/AR 只抛“业务事件“,

一、SLA 设计哲学SLA(Subledger Accounting)是所有子模块到 GL 之间的会计转换引擎,不是记账工具。业财分离 OM/INV/AR 只抛"业务事件",不直写 GL;会计规则全收在 SLA,"一套业务、多套财务&…

2026/7/30 9:22:44 阅读更多 →
零基础读懂 Spring Boot AI 网关:从场景定义到调用大模型的完整流程

零基础读懂 Spring Boot AI 网关:从场景定义到调用大模型的完整流程

前言随着大语言模型技术的发展,AI 能力逐渐从单一对话工具转变为可嵌入业务系统的智能服务能力。本项目基于 Spring Boot 与 Spring AI 框架,设计并实现了一套轻量化 AI 网关服务,用于统一管理不同业务场景下的大模型调用流程。传统应用在接入…

2026/7/26 8:45:56 阅读更多 →
Effective C++ 学习笔记 条款39 明智而审慎地使用private继承

Effective C++ 学习笔记 条款39 明智而审慎地使用private继承

条款32 展示了 C 将 public 继承视为 is-a 关系。它通过这样一个例子来说明:当 Student 以 public 方式继承自 Person 时,如果函数调用需要,编译器会隐式地将 Student 转换为 Person。这里值得用 private 继承代替 public 继承,再…

2026/7/27 22:43:12 阅读更多 →

最新新闻

幻兽帕鲁存档编辑终极指南:三步掌握游戏数据自由修改

幻兽帕鲁存档编辑终极指南:三步掌握游戏数据自由修改

幻兽帕鲁存档编辑终极指南:三步掌握游戏数据自由修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档编辑工具&#xff0…

2026/7/30 12:46:05 阅读更多 →
CuteTranslation:Linux上终极屏幕取词翻译工具完整使用指南

CuteTranslation:Linux上终极屏幕取词翻译工具完整使用指南

CuteTranslation:Linux上终极屏幕取词翻译工具完整使用指南 【免费下载链接】CuteTranslation Linux屏幕取词翻译软件 项目地址: https://gitcode.com/gh_mirrors/cu/CuteTranslation 还在为Linux系统上阅读英文文档而烦恼吗?😫 想要一…

2026/7/30 12:46:05 阅读更多 →
Beyond Compare 5密钥生成器:一键获取永久激活码的完整指南

Beyond Compare 5密钥生成器:一键获取永久激活码的完整指南

Beyond Compare 5密钥生成器:一键获取永久激活码的完整指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 还在为Beyond Compare 5的30天试用期到期而烦恼吗?当你在专注…

2026/7/30 12:46:05 阅读更多 →
3分钟解锁网易云音乐:ncmdump让你的NCM文件重获自由

3分钟解锁网易云音乐:ncmdump让你的NCM文件重获自由

3分钟解锁网易云音乐:ncmdump让你的NCM文件重获自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否在网易云音乐下载了喜欢的歌曲,却发现只能在特定客户端播放?那些被加密的NCM格式文件像被…

2026/7/30 12:46:05 阅读更多 →
常州本地家电维修师傅电话推荐|本地维修家电|欧米到家统一报修

常州本地家电维修师傅电话推荐|本地维修家电|欧米到家统一报修

常州家电维修首选欧米到家,服务覆盖天宁区、钟楼区、新北区、武进区、金坛区、溧阳市全域片区。所有维修师傅均持证上岗,拥有 5-10 年一线维修经验。主营:空调、冰箱、洗衣机、热水器、燃气灶、壁挂炉、太阳能维修;同步承接管道疏…

2026/7/30 12:46:05 阅读更多 →
C语言分支与循环结构详解与性能优化

C语言分支与循环结构详解与性能优化

1. C语言分支与循环基础解析作为一门经典的编程语言,C语言的分支和循环结构是构建程序逻辑的基础骨架。在实际开发中,约70%的代码都会涉及这两种控制结构。不同于现代语言的各种语法糖,C语言用最简洁的语法实现了完整的流程控制能力。初学者常…

2026/7/30 12:45:05 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻