springboot启动tomcat源码分析

本文详细解析了SpringBoot如何通过自动配置启动Tomcat服务器,从main方法出发,深入ServletWebServerFactory的实现,揭示了启动决策机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了将清楚,会用许多图片,我的springboot版本是2.7.6,版本差异几乎都没有,所以不用担心版本问题

 ec7fc3db580749aa8e31cd9d5bb320f4.png

 

86dde2b7ff0440ceacd73fec463788b5.png

891bc68603da437b8d1a0be9bb2f8bcc.png

已经我们可以看到springboot 已经帮我们自动依赖了tomcat,所以我们不需要再次导入tomcat依赖

我们从main方法一步一步的进入,看看springboot如何启动tomcat的

698a97d80bce47c1a61b51b46627383f.png

4059fb887f3740348991c896e58e2307.png

78d06540b2404f5b962f4800b2bffaa4.png

我们主要看这个方法,前面是springboot的启动流程,我上一篇文章已经说过了,需要的去看我的上一篇文章,我们进去这个方法。

1997c8696afa4f63ab8394bde8b86bbf.png

d2d16395b5584712bc10992559a05730.png

4ec646517722488d86424415d7026973.png

这是一个接口,我们看看他的实现类

29da3969791b4e988e32e2abc0ce944d.png

 我们看看servelWeb的实现方法

c59d24e5ccaa4a7299d25a5661900719.png

我们看到这个实现方法里面又调用了一个方法,我们继续进去看看 

76f48e731e694991a06f5be06a4611b7.png

我们看这个方法里面写了什么

b2d6d09f5d1b4936834c2b34aef4b36b.png

进入到这个方法里面看看,坚持看下去,马上就明白了

35b0d665fa3b4605b7c513fb40997820.png

 

看到没,这是一个空方法,里面没有实现,我们看看哪些类重写了这个方法

ca4b9452f2e74998b8637ff4b3176c2d.png

看到没,我们亲爱的ServletWeb类重写了这个方法,所以饶了一大圈,程序又执行到了ServletWeb类里面的方法

8bafaa8737a1496fa70dd75f1030b138.png

我们继续看程序的执行,现在到了这个方法里面,我们进去看看

ad8818d2a2c7473991c0dd9872503cac.png

重点来了,我们先看红框里面的类 

f2f5bb189aee447b9deb3a4bb9c69c32.png

这又是一个接口,我们看看接口的实现类

e903f67e6fdc4993863a396861ba931a.png

我们的tomcat来了,实现类有tomcat和jetty 

e0867579649d4d4199a06e8862f3fb21.png

所以这个方法是用来判断要启动哪个服务器的,我们先放一放这个方法,看看tomcat这个实现类是如何启动tomcat的39decf8e2d214b4c83a5e0b68648d0f3.png 

 忘记说了一个,这个接口里面还有一个方法,我们看看tomcat实现类是如何使用这个方法

e72f5ac1a54e4abbb0a5e2523bc1f516.png

 新建一个tomcat对象,获取tomcat端口,我们看看如何获取端口

10bfbd77a3f84b78b1eee0bc4119a722.png

6ddaada38b2c4a0ea72d6af71be34084.png

 

97b9b8109b3c4abbb986b7c2b35fadab.png

这下tomcat算是启动起来了,但是,还没有结束,我们前面说到

eefa3bb6bfe54499aed9c9e7aec74244.png

第一个箭头指的是接口,这个接口有tomcat和jetty实现的类,具体返回哪个实现类,就要看第二个箭头的方法判断是哪个实现类返回,我们进入第二个箭头看看去

3b1cd6e8e8e14552a462fa468408ee68.png

 这个方法通过拿取ServletWebServerFactory类型bean对象个数来进行判断,我们前面已经说过ServletWebServerFactory这是一个接口,有tomcat和jetty实现类,到底哪个实现类可以完成bean的注入呢,我们看到如果没有找到一个ServletWebServerFactory类型的bean就报错,找到了两个以上的ServletWebServerFactory的bean也报错,所以springboot只能启动一个web服务器,我们看看这个bean如何注册,如何找。

0f8cffe56f7d4289baeef961cfa24c77.png

我们知道springboot都是通过自动配置bean的,所以我们要找到自动配置类

6f057fc71ea7487c89b2484f8a336b1c.png

cf38f2852cc04cf38b2428339888ce59.png

这个类注解很多,我们只看import注解,里面都自动配置类 

5009b500ded941af94348e48ae7689e2.png

我们只看jetty的自动配置类,看看上面的注解, 

@ConditionalOnClass({Servlet.class, Server.class, Loader.class, WebAppContext.class})

这个表示里面项目里面有没有这个jar包如果有我就开启这个注解,否则关闭

@ConditionalOnMissingBean(
    value = {ServletWebServerFactory.class},
    search = SearchStrategy.CURRENT
)

这个就是说你要想这个BEAN生效,就不能有ServletWebServerFactory类型的bean存在,也就是你不可以自己定义web启动器,如果你自己定义了springboot就会用你自己定义的,自己定义好处,可以自己更多的设置一些默认的值

所以最后又回到了pom文件,如果你导入了这个依赖有这个jar包,自动配置就会配置这个web服务器的bean,没有就不配置这个bean,找不到这个bean,就不返回这个对象,找到就返回,返回之后就调用接口里面重写的方法,然后启动WEB服务器,然后就没有然后了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值