SpringBoot 内嵌 Tomcat 的启动流程

发布时间:2026/7/29 3:15:47
SpringBoot 内嵌 Tomcat 的启动流程 Spring Boot 内嵌 Tomcat 的启动流程本质上就是把“手动部署WAR包到外部Tomcat”这件事变成通过Java代码在main方法里一键启动。整个流程拆成三大阶段用最通俗的话讲透阶段一SpringApplication 启动触发自动配置当你点击运行SpringBootApplication的main方法时SpringApplication.run()开始执行核心刷新refresh容器。Spring Boot的自动配置机制会扫描类路径发现你依赖了spring-boot-starter-web这会触发ServletWebServerFactoryAutoConfiguration配置类。这个配置类会做一件事创建一个内嵌Web服务器的工厂。默认情况下因为Tomcat的依赖存在它会创建TomcatServletWebServerFactory。这个工厂就是专门负责“生产”Tomcat服务器的。阶段二创建并配置 Tomcat 实例这个阶段是整个流程的肉它发生在refresh上下文时的onRefresh()方法里具体步骤如下工厂开始构建TomcatServletWebServerFactory的getWebServer()方法被调用此时会实例化一个原生的org.apache.catalina.startup.Tomcat对象。设置基础目录basedir通常是操作系统的临时目录。配置核心组件Engine/Host/Context创建Engine引擎默认名字叫Tomcat。创建Host虚拟主机默认是localhost并设置应用根目录。最关键的一步创建Context上下文。这个Context代表你的整个Spring Boot应用它的路径通常是空字符串即根路径。添加Servlet即DispatcherServletSpring Boot会创建一个DispatcherServlet的Bean。然后将这个Servlet动态添加到刚才创建的Context中并映射到/即所有请求。注意这里的添加并不是通过web.xml而是通过编程方式调用Tomcat.addServlet()和Context.addServletMapping()。设置端口和连接器读取你配置文件里的server.port默认8080设置到Tomcat的Connector连接器上。默认使用NIO协议org.apache.coyote.http11.Http11NioProtocol。此时Tomcat实例已经构建完毕但还没有启动只是准备好了。阶段三启动 Tomcat 并发布 ServletContext这是最后的点火动作触发启动在refresh容器的最后一步finishRefresh会调用TomcatWebServer的start()方法。内部启动链调用Tomcat.start()- 这会启动所有组件Connector、Engine、Host、Context。连接器Connector开始监听指定端口准备接收HTTP请求。同时会触发ServletContextInitializer回调执行你所有的Filter、Listener的初始化。发布事件启动成功后Spring Boot会发布ServletWebServerInitializedEvent事件表示内嵌服务器已就绪。阻塞等待最后TomcatWebServer会启动一个非守护线程keepAlive让主线程阻塞保证Tomcat一直运行等待请求进来。核心时序图与外部Tomcat部署的关键区别面试加分点对比维度外部Tomcat传统WARSpring Boot 内嵌Tomcat启动入口由Tomcat脚本catalina.sh触发由Java的main()方法触发Servlet容器独立进程部署多个WAR嵌入在JVM中随应用启动和停止Context创建方式解析web.xml或注解扫描编程式创建Context并手动注册DispatcherServlet类加载器复杂的委派机制Common/Shared/Webapp相对简单直接使用应用类加载器AppClassLoader适用场景多应用共享Tomcat微服务、云原生、独立运行