在文章 Springboot3.3.5 启动流程(源码分析) 中讲到 应用上下文(applicationContext
)刷新(refresh)时使用模板方法 onRefresh
创建了 Web Server.
本文将详细介绍 ServletWebServer — Embedded tomcat 的启动流程。
首先,通过 ServletWebServerApplicationContext
的方法 getWebServerFactory
获取当前配置的唯一的 ServletWebServerFactory
(它的实现有三个:JettyServletWebServerFactory
、TomcatServletWebServerFactory
、UndertowServletWebServerFactory
), 本示例中是 TomcatServletWebServerFactory
。
第二步,直接通过 TomcatServletWebServerFactory
的方法获取 getWebServer
启动好的 tomcat 。
getWebServer
方法中首先创建 一个 tomcat, 剩下的就是对tomcat 的配置。
prepareContext
prepareContext 的核心功能就是配置 TomcatEmbeddedContext
。 TomcatEmbeddedContext
通过 Host 和 tomcat
建立关系:
prepareContext 函数关键代码:
protected void prepareContext(Host host, ServletContextInitializer[] initializers) {File documentRoot = getValidDocumentRoot();TomcatEmbeddedContext context = new TomcatEmbeddedContext();...context.addLifecycleListener(new FixContextListener());...WebappLoader loader = new WebappLoader();loader.setLoaderInstance(new TomcatEmbeddedWebappClassLoader(parentClassLoader));...if (isRegisterDefaultServlet()) {addDefaultServlet(context);}if (shouldRegisterJspServlet()) {addJspServlet(context);addJasperInitializer(context);}context.addLifecycleListener(new StaticResourceConfigurer(context));host.addChild(context);configureContext(context, initializersToUse);postProcessContext(context);}
getTomcatWebServer
方法 getTomcatWebServer
中启动了 tomcat:
start 方法执行完后, tomcat 就启动好(此时不接收用户请求)。
最后,整理一份 Spring boot 内嵌(embedded )tomcat 启动主要流程图(不可深究 😊 ):
Springboot 内嵌(embedded )tomcat 启动流程到此就介绍完了, 希望对各位小伙伴有所帮助。