【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,请求到了,是不是就都正确处理啦。
2.1 Web 容器的创建
首先我们看看创建:
源码要多看哈,看不懂就多看几遍就熟悉了,调试的时候注意看哪个类哪个方法哈。
至于创建 WebServer的时候,DispatcherServlet怎么放进 Tomcat的,看我上边的博客哈,里边也是详细的说了哈,这里就不重复了。
看日志:
这时我们的 Tomcat还没启动,也就是端口还没监听,也就不会有请求。
2.2 Web 容器的启动
那我们看看什么时候启动的:
执行完start看日志:
这是调用我们的Controller,就有响应啦。
3 小结
好啦,这节我们主要看了下 SpringBoot 和 Web容器的协同哈,也就是什么时候 Tomcat可以处理请求哈,有理解不对的地方欢迎指正哈。