SpringMVC源码学习-SpringMVC的请求流程
大约 2 分钟
通过分析流程图并结合Spring MVC源码,我们可以将请求处理流程拆解为以下关键步骤:
- 入口方法 - doDispatch()(DispatcherServlet核心方法)
源码定位:DispatcherServlet#doDispatch
- 整个请求处理的总调度中心
- 通过
getHandler()
获取HandlerExecutionChain(包含handler和interceptors)
- 文件上传检查
涉及组件:MultipartResolver
源码流程:
processedRequest = checkMultipart(request);
// 在checkMultipart()中调用multipartResolver.resolveMultipart()
- 处理器映射
涉及组件:HandlerMapping
源码关键方法:
mappedHandler = getHandler(processedRequest);
// 遍历所有HandlerMapping,返回第一个匹配的HandlerExecutionChain
- 处理器适配
涉及组件:HandlerAdapter
源码关键点:
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 通过supports()方法匹配适配器
- 拦截器前置处理
源码执行路径:
if (!mappedHandler.applyPreHandle(...)) return;
// 按顺序执行拦截器的preHandle()
- 核心业务处理
源码核心方法:
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 实际执行Controller方法,返回ModelAndView
- 异步处理判断
源码处理逻辑:
if (asyncManager.isConcurrentHandlingStarted()) {
return; // 立即返回,后续由异步线程处理
}
- 视图解析流程
涉及组件:ViewResolver
、RequestToViewNameTranslator
源码关键步骤:
if (mv.getViewName() == null) {
mv.setViewName(getDefaultViewName(request)); // 使用视图名翻译器
}
View view = resolveViewName(mv.getViewName(), ...); // 视图解析器处理
- 拦截器后置处理
源码执行:
mappedHandler.applyPostHandle(...);
// 逆序执行拦截器的postHandle()
- 异常处理机制
涉及组件:HandlerExceptionResolver
源码处理逻辑:
if (exception != null) {
mv = processHandlerException(...);
// 遍历异常解析器处理异常
}
- 视图渲染阶段
源码渲染过程:
view.render(mv.getModelInternal(), request, response);
// 合并模型数据,调用具体View实现(如JSP、Thymeleaf)
- 资源清理阶段
源码finally块:
if (multipartRequestParsed) {
cleanupMultipart(...); // 清理上传临时文件
}
九大核心组件协同工作:
- HandlerMapping(处理器映射)
- HandlerAdapter(处理器适配)
- HandlerExceptionResolver(异常解析)
- ViewResolver(视图解析)
- RequestToViewNameTranslator(视图名翻译)
- LocaleResolver(国际化)
- ThemeResolver(主题解析)
- MultipartResolver(文件上传)
- FlashMapManager(重定向参数)
源码学习建议:
- 重点跟踪DispatcherServlet的doDispatch()方法
- 关注HandlerExecutionChain的处理流程
- 研究适配器模式在HandlerAdapter中的实现
- 调试视图解析链的构建过程
- 分析异常处理的责任链模式实现
通过这个流程可以看出,Spring MVC通过清晰的组件划分和职责分离,实现了高度可扩展的请求处理机制。每个扩展点(如拦截器、视图解析器等)都对应着特定的接口,这种设计非常值得在架构设计中借鉴。