
初始化
初始化过程从 Web容器调用 DispatcherServlet Servlet.init()
方法开始。
实际调用到 HttpServletBean.init()
HttpServletBean
HttpServletBean负责设置init-params属性及作为整个Spring Servlet的入口。
HttpServletBean.init()
-
对比 ServletConfig 的 init-params 和 requiredProperties。确认无遗漏。
-
用
BeanWrapper.setPropertyValues(PropertyValues,boolean)
设置属性到自己(及子类)的属性上。 -
调用模版方法initServletBean()
FrameworkServlet
负责集成Spring application Context
FrameworkServlet.initServletBean()
- 调用
FrameworkServlet.initWebApplicationContext()
创建初始化WebApplicationContext
FrameworkServlet.initWebApplicationContext()
-
createWebApplicationContext()
创建 tWebApplicationContext -
configureAndRefreshWebApplicationContext()
设置Servlet 相关属性到 context。调用WebApplicationContext.refresh()
-
调用模板方法
onRefresh()
,令子类可以再 WebApplicationContext.refersh() 后进行初始化。
DispatcherServlet
- onRefresh() 方法调用 initStrategies() 初始化各个组件
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
组件init 的时候会先
-
尝试从当前容器中取出所有满足类型的bean。
-
如果什么都没找到的话,则用getDefaultStrategies(context, targetClass) 从 DispatcherServlet.properties 中获取默认配置
处理请求
FrameworkServlet
override了service(), doGet(), doPost() 等方法,同一把请求交给 FrameworkServlet.processResult(HttpServletRequest, HttpServletResponse)
处理
FrameworkServlet.processResult
-
保存之前的localeContxt 和 requestAttributes。生成并设置新的localContext 和requestAttributes。(localeContxt 和 requestAttributes均为thread local 的属性)
-
调用模版方法doService(request, response) 将实际的处理请求留给子类实现
-
恢复localeContext 和requestAttributes。发布ServletRequestHandledEvent 事件
DispatchServlet
doService()
调用 doDispatch()
具体处理
doDispatch 分为两部分
第一部分先调用 handler 处理请求
-
checkMultipart(request) 处理文件上传
-
mappedHandler = getHandler() 获取 handler execution chain
-
ha = getHandlerAdapter() 获取handler adapter
-
mappedHandler.applyPreHandle() 执行intercepters 的preHandle 方法
-
mv = ha.handle(request, response, mappedHandler.getHandler()) 实际调用handler
-
mappedHandler.applyPostHandle() 执行intercepters 的postHandle 方法
第二部分渲染view
-
过程中所有的Exception 都被catch 到 dispatchException 中。然后调用processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)。
-
先检查有没有dispatchException,有的话先调用processHandlerException获取新的error 的 modelAndView。processHandlerException 使用handlerExceptionResolvers 处理exception,返回新的 modelAndView, 然后将 exception 中的属性设置到request attrs 中供之后渲染使用。
-
processDispatchResult 调用 render(mv, request, response) 实际渲染 view。
-
渲染结束之后调用结束之后调用 mappedHandler.triggerAfterCompletion(request, response, exception) 执行 intercepters.afterCompletion 方法,这里的exception 为渲染过程中出现的exception
网友评论