springboot启动tomcat源码分析

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

 springboot启动tomcat源码分析_第1张图片

 

springboot启动tomcat源码分析_第2张图片

springboot启动tomcat源码分析_第3张图片

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

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

springboot启动tomcat源码分析_第4张图片

springboot启动tomcat源码分析_第5张图片

springboot启动tomcat源码分析_第6张图片

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

springboot启动tomcat源码分析_第7张图片

springboot启动tomcat源码分析_第8张图片

springboot启动tomcat源码分析_第9张图片

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

29da3969791b4e988e32e2abc0ce944d.png

 我们看看servelWeb的实现方法

springboot启动tomcat源码分析_第10张图片

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

springboot启动tomcat源码分析_第11张图片

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

springboot启动tomcat源码分析_第12张图片

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

springboot启动tomcat源码分析_第13张图片

 

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

ca4b9452f2e74998b8637ff4b3176c2d.png

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

springboot启动tomcat源码分析_第14张图片

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

springboot启动tomcat源码分析_第15张图片

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

springboot启动tomcat源码分析_第16张图片

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

e903f67e6fdc4993863a396861ba931a.png

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

springboot启动tomcat源码分析_第17张图片

所以这个方法是用来判断要启动哪个服务器的,我们先放一放这个方法,看看tomcat这个实现类是如何启动tomcat的springboot启动tomcat源码分析_第18张图片 

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

springboot启动tomcat源码分析_第19张图片

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

springboot启动tomcat源码分析_第20张图片

springboot启动tomcat源码分析_第21张图片

 

springboot启动tomcat源码分析_第22张图片

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

springboot启动tomcat源码分析_第23张图片

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

springboot启动tomcat源码分析_第24张图片

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

springboot启动tomcat源码分析_第25张图片

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

springboot启动tomcat源码分析_第26张图片

springboot启动tomcat源码分析_第27张图片

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

springboot启动tomcat源码分析_第28张图片

我们只看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服务器,然后就没有然后了

 

你可能感兴趣的:(spring,boot,java,后端)