tomcat-spring整合

361 阅读1分钟

Spring启动,如何初始化Tomcat

spirngbootApplication#run -> AbstractApplicationContext#refresh -> #onRefresh-> ServletWebServerApplicationContext#onRefresh -> #createWebServer-> ServletWebServerFactory#getWebServer -> TomcatServletWebServerFactory#getWebServer-> 创建ConnectorContainer-> AbstractApplicationContext#finishRefresh -> webServer#start-> StandContext#startInternal, StandWrapper#setServletDispatcherSevlet设置到Tomcat容器中
​
    ->DispatcherServletAutoConfiguration 
      .DispatcherServletConfiguration,初始化DispatcherServlet
      .DispatcherServletRegistrationConfiguration#dispatcherServletRegistration,初始化ServletRegistrationBean
    -> ServletRegistrationBean,设置DesipatcherServlet
    -> ApplicationContext#addServlet,设置到StandardWrapper

一个请求是如何到controller接口的?

  1. SpringBoot启动,创建Tomcat,初始化Tomcat,将DispatcherSevlet设置到Tomcat容器中

  2. Spring识别@Controller、@RequestMapping,将其封装成HandlerMapping(handlerMappings)

  3. Tomcat接收到请求,转发到Spring

    1. Acceptor#run,ServerSocket#accept,创建PollerEvent

    2. Poller#run,IO多路复用

    3. SocketProcessor#run,Http11Processor#service ,解析请求

    4. 执行容器中的管道、阀门

      1. Adapter#service,调用Engine管道的第一个阀门
      2. StandardEngineValve#invoke,调用Host管道的第一个阀门
      3. StandardHostValve#invoke,调用Context管道的第一个阀门
      4. StandardContextValve#invoke,调用Wrapper管道的第一个阀门
      5. StandardWrapperValve#invoke,Wrapper最后一个阀门负责创建Servlet,创建并执行过滤器 (servlet: 第1步已经设置为DispatcherServlet)
    5. 执行Filter过滤器链#doFilter,最后一个Filter将执行Servlet (Spring也将自己的过滤器添加到了Tomcat中)

    6. ApplicationFilterChain#doFilter,servlet#service

  4. DispatcherServlet#doService -> doDispatch

  5. #getHandler,根据当前请求获取处理器

  6. #getHandlerAdapter,获取请求适配器

  7. #applyPreHandle,拦截器预处理,HandlerInterceptor#preHandle

  8. HandlerAdapter#handle,通过Method反射,真正执行到Controller的方法

  9. #applyPostHandle,拦截器后置处理,HandlerInterceptor#postHandle