本文是根据SpringBoot2.5.2 进行解析
一、初始化
SpringBoot应用启动之后,会做一些Spring容器方面的初始化工作,包括自动配置、Bean创建初始化,国际化等,这些工作跟Servlet请求流程还没产生联系。
在请求真正的进来之后,第一次请求会执行Servlet的初始化工作,如下图:
初始化内容:
1.HttpServletBean.init().
Set bean properties from init parameters.
2.初始化web容器并进行刷新
3.执行子类Dispatch Servlet的refresh 方法
4.DispatchServlet中的onRefresh方法进行初始化一些策略组件
5.initHandlerMapping 并根据Order进行排序
6.initHandlerAdapters 并根据Order进行排序
/**
* Initialize the HandlerAdapters used by this class.
* <p>If no HandlerAdapter beans are defined in the BeanFactory for this namespace,
* we default to SimpleControllerHandlerAdapter.
*/
7.init ExceptionHandler
8.initRequestToViewNameTranslator
9.initViewResolver
以上初始化工作已完成!
二、请求处理
请求需要经过层层过滤器到达DispatchServlet的doDispatch方法
doDispatch方法流程如下:
1.验证请求是否是上传文件的请求
2.获取请求的handler
确切的说是HandlerExecutionChain
3.获取请求的HandlerAdapter
4.执行拦截器的preHandle方法
5.获取ModelAndView
主要通过这个方法获取:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#handleInternal
此时controller中的目标方法已经执行完毕,接下来要执行拦截器的postHandle方法
6.拦截器postHandle方法
7.最后执行 processDispatchResult