【SpringBoot + Tomcat】SpringBoot 跟 Tomcat 的协同,Tomcat什么时候知道 SpringBoot 可以处理请求了或者 SpringBoot 什么时候告诉 Tomcat 我可以处理请求了?

1  前言

这节我们来讨论下 Spring MVC 和 Web容器(这里我们拿Tomcat来说)两者启动的思考,不知道大家有没有想过,我们的 SpringBoot 是在启动的时候会创建 Tomcat出来,那么我Tomcat什么时候知道你 SpringBoot 已经启动完毕可以处理请求呢?或者说 SpringBoot 启动完如何告诉 Tomcat 我启动好了,可以处理请求了,可以把请求给我了,类似这么个意思。当然这是我的一个疑惑思考哈,这节我们来看看两者是如何协调的。

2  剖析

首先我们要知道请求的入口是人家 Tomcat 也就是 Tomcat开始监听某个端口了,就表示请求就可以进到 Tomcat里了,是不是?这点大家认同的吧。

那么请求进到 Tomcat 会被正确处理的前提是什么? 是不是我们 SpringBoot 上下文刷新完毕并把 DispatcherServlet 扔进 Tomcat里,上下文刷新完毕,比如我们的 Service 才能提供能力,把 DispatcherServlet 扔进 Tomcat,就会将请求给到 DispatcherServlet 继而找到我们的 Controller 然后到我们的 Service,这点儿大家理解的吧。

基于这样的思考,那么什么时候告诉 Tomcat开启监听呢? 是不是我们 SpringBoot 上下文都准备好了,并且把 DispatcherServlet 放进 Tomcat里,然后启动 Tomcat,这样监听一开比如8080,请求到了,是不是就都正确处理啦。

熟悉 SpringBoot 启动的话,其实也都知道 Tomcat的创建和启动是分开的,先把 Tomcat创建出来(并且创建的时候会在与 Tomcat的桥梁即 ServletContextInitializer 放置我们的 DispatcherServlet,这里不知道的可以看我的 传统VS现代启动方式的区别 以及 Tomcat 和 MVC 的关联这两篇哈,会说Tomcat的桥梁以及 SpringBoot启动的时候如何把 DispatcherServlet 扔进 Tomcat的),注意这时候还没启动,也就是不会监听,请求压根到不了,等刷新完上下文后,才开始启动 Tomcat的,即可以提供服务啦。我们来调试看看:

2.1  Web 容器的创建

首先我们看看创建:

源码要多看哈,看不懂就多看几遍就熟悉了,调试的时候注意看哪个类哪个方法哈。

至于创建 WebServer的时候,DispatcherServlet怎么放进 Tomcat的,看我上边的博客哈,里边也是详细的说了哈,这里就不重复了。

看日志:

这时我们的 Tomcat还没启动,也就是端口还没监听,也就不会有请求。

2.2  Web 容器的启动

那我们看看什么时候启动的:

执行完start看日志:

这是调用我们的Controller,就有响应啦。

3  小结

好啦,这节我们主要看了下 SpringBoot 和 Web容器的协同哈,也就是什么时候 Tomcat可以处理请求哈,有理解不对的地方欢迎指正哈。

posted @ 2023-08-16 07:09  酷酷-  阅读(125)  评论(0编辑  收藏  举报