阿古达芝麻开门 - 博客园

内嵌的tomcat是如何创建的

PartA: ServletWebServerFactory factory = getWebServerFactory();

首先获取到beanName是tomcatServletWebServerFactory:

图片

然后调用开始调用AbstractBeanFactory#doGetBean开始创建bean,你又会看到熟悉的代码:

图片

在AbstractAutowireCapableBeanFactory#createBean方法中会调用doCreateBean,接着留意createBeanInstance这个方法:

图片

在createBeanInstance这个方法里,留意instantiateUsingFactoryMethod,会根据ServletWebServerFactoryConfiguration$Embedded这个factorybean name创建一个factoryBean. factoryBean = this.beanFactory.getBean(factoryBeanName);实际上又是去执行创建bean的流程

图片

图片

然后会通过SimpleInstantiationStrategy#instantiate调用ServletWebServerFactoryConfiguration#tomcatServletWebServerFactory创建tomcatServletWebServerFactory

图片

图片

接下来关注initializeBean,这里会执行几个重要的beanPostProcessors

图片

图片WebServerFactoryCustomizerBeanPostProcessor#postProcessBeforeInitialization,会遍历beanDefinition找到相关的bean,并实例化相关的5个bean

图片
图片

最终返回5个customizers:
图片
然后会依次执行这5个customizers的customize方法

图片

TomcatWebSocketServletWebServerCustomizer:暂不分析
ServletWebServerFactoryCustomizer
图片

上面这个方法会调用ServletWebServerFactoryAutoConfiguration#servletWebServerFactoryCustomizer方法创建ServletWebServerFactoryCustomizer
图片

TomcatServletWebServerFactoryCustomizer:暂不分析
TomcatWebServerFactoryCustomizer:暂不分析

 

ServletWebServerFactoryAutoConfiguration是核心配置类,PartA的总体任务是根据配置创建ServletWebServerFactory及其相关的bean.

 

PartB: this.webServer = factory.getWebServer(getSelfInitializer());

getSelfInitializer主要会注册所有的 servlet 组件 (包括 Servlet,Filter,Listener)

图片

 getWebServer主要是创建了Tomcat对象,并设置tomcat的相关配置,

图片

紧接着调用getTomcatWebServer会启动tomcat:

图片

tomcat启动后会启动守护线程,防止tomcat停止,也是SpringBoot run方法后不会结束的原因。

图片

 更多了解请关注一米源码公众号并回复SpringBoot或https://itproject-manager.com/

posted @   阿古达芝麻开门  阅读(150)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示