Spring启动,如何初始化Tomcat
spirngbootApplication#run -> AbstractApplicationContext#refresh -> #onRefresh
-> ServletWebServerApplicationContext#onRefresh -> #createWebServer
-> ServletWebServerFactory#getWebServer -> TomcatServletWebServerFactory#getWebServer
-> 创建Connector、Container
-> AbstractApplicationContext#finishRefresh -> webServer#start
-> StandContext#startInternal, StandWrapper#setServlet 将DispatcherSevlet设置到Tomcat容器中
->DispatcherServletAutoConfiguration
.DispatcherServletConfiguration,初始化DispatcherServlet
.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration,初始化ServletRegistrationBean
-> ServletRegistrationBean,设置DesipatcherServlet
-> ApplicationContext#addServlet,设置到StandardWrapper中
一个请求是如何到controller接口的?
-
SpringBoot启动,创建Tomcat,初始化Tomcat,将DispatcherSevlet设置到Tomcat容器中
-
Spring识别@Controller、@RequestMapping,将其封装成HandlerMapping(handlerMappings)
-
Tomcat接收到请求,转发到Spring
-
Acceptor#run,ServerSocket#accept,创建PollerEvent
-
Poller#run,IO多路复用
-
SocketProcessor#run,Http11Processor#service ,解析请求
-
执行容器中的管道、阀门
- Adapter#service,调用Engine管道的第一个阀门
- StandardEngineValve#invoke,调用Host管道的第一个阀门
- StandardHostValve#invoke,调用Context管道的第一个阀门
- StandardContextValve#invoke,调用Wrapper管道的第一个阀门
- StandardWrapperValve#invoke,Wrapper最后一个阀门负责创建Servlet,创建并执行过滤器 (servlet: 第1步已经设置为DispatcherServlet)
-
执行Filter过滤器链#doFilter,最后一个Filter将执行Servlet (Spring也将自己的过滤器添加到了Tomcat中)
-
ApplicationFilterChain#doFilter,servlet#service
-
-
DispatcherServlet#doService -> doDispatch
-
#getHandler,根据当前请求获取处理器
-
#getHandlerAdapter,获取请求适配器
-
#applyPreHandle,拦截器预处理,HandlerInterceptor#preHandle
-
HandlerAdapter#handle,通过Method反射,真正执行到Controller的方法
-
#applyPostHandle,拦截器后置处理,HandlerInterceptor#postHandle