为了将清楚,会用许多图片,我的springboot版本是2.7.6,版本差异几乎都没有,所以不用担心版本问题
已经我们可以看到springboot 已经帮我们自动依赖了tomcat,所以我们不需要再次导入tomcat依赖
我们从main方法一步一步的进入,看看springboot如何启动tomcat的
我们主要看这个方法,前面是springboot的启动流程,我上一篇文章已经说过了,需要的去看我的上一篇文章,我们进去这个方法。
这是一个接口,我们看看他的实现类
我们看看servelWeb的实现方法
我们看到这个实现方法里面又调用了一个方法,我们继续进去看看
我们看这个方法里面写了什么
进入到这个方法里面看看,坚持看下去,马上就明白了
看到没,这是一个空方法,里面没有实现,我们看看哪些类重写了这个方法
看到没,我们亲爱的ServletWeb类重写了这个方法,所以饶了一大圈,程序又执行到了ServletWeb类里面的方法
我们继续看程序的执行,现在到了这个方法里面,我们进去看看
重点来了,我们先看红框里面的类
这又是一个接口,我们看看接口的实现类
我们的tomcat来了,实现类有tomcat和jetty
所以这个方法是用来判断要启动哪个服务器的,我们先放一放这个方法,看看tomcat这个实现类是如何启动tomcat的
忘记说了一个,这个接口里面还有一个方法,我们看看tomcat实现类是如何使用这个方法
新建一个tomcat对象,获取tomcat端口,我们看看如何获取端口
这下tomcat算是启动起来了,但是,还没有结束,我们前面说到
第一个箭头指的是接口,这个接口有tomcat和jetty实现的类,具体返回哪个实现类,就要看第二个箭头的方法判断是哪个实现类返回,我们进入第二个箭头看看去
这个方法通过拿取ServletWebServerFactory类型bean对象个数来进行判断,我们前面已经说过ServletWebServerFactory这是一个接口,有tomcat和jetty实现类,到底哪个实现类可以完成bean的注入呢,我们看到如果没有找到一个ServletWebServerFactory类型的bean就报错,找到了两个以上的ServletWebServerFactory的bean也报错,所以springboot只能启动一个web服务器,我们看看这个bean如何注册,如何找。
我们知道springboot都是通过自动配置bean的,所以我们要找到自动配置类
这个类注解很多,我们只看import注解,里面都自动配置类
我们只看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服务器,然后就没有然后了