# Spring mvc 源码剖析


<!--more-->


## 一、DispatcherServlet继承结构

![img_6](https://img.zhaojq.top/20260727092020316.png "img_6")

## 二、重要时机点分析

### 1.handler方法执行时机

![img_7](https://img.zhaojq.top/20260727092020541.png "img_7")

![img_8](https://img.zhaojq.top/20260727092020726.png "img_8")

`doDispatch`方法的 `ha.handle`方法调用 

### 2.页面渲染时机

jsp页面打断点

![img_9](https://img.zhaojq.top/20260727092020965.png "img_9")

调用了` processDispatchResult`

Spring处理请求的流程为：

1. 调⽤getHandler()获取到能够处理当前请求的执⾏链 HandlerExecutionChain(handler+拦截器)
2. 调⽤getHandlerAdapter()；获取能够执⾏1中Handler的适配器
3. 适配器调⽤Handler执⾏ha.handle（总会返回⼀个ModelAndView对象）
4. 调⽤processDispatchResult()⽅法完成视图渲染跳转

```java
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpServletRequest processedRequest = request;
		HandlerExecutionChain mappedHandler = null;
		boolean multipartRequestParsed = false;

		WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

		try {
			ModelAndView mv = null;
			Exception dispatchException = null;

			try {
        //检查是否是文件上传请求
				processedRequest = checkMultipart(request);
				multipartRequestParsed = (processedRequest != request);

				// Determine handler for the current request.
        //取得处理当前请求的Controller，这⾥也称为Handler，即处理器
        //这⾥并不是直接返回 Controller，⽽是返回 HandlerExecutionChain 请求处理链对象
				//该对象封装了Handler和Inteceptor
				mappedHandler = getHandler(processedRequest);
				if (mappedHandler == null) {
					// 如果 handler 为空，则返回404
					noHandlerFound(processedRequest, response);
					return;
				}

				// Determine handler adapter for the current request.
        //获取处理请求的处理器适配器 HandlerAdapter
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

				// Process last-modified header, if supported by the handler.
        //处理 last-modified 请求头
				String method = request.getMethod();
				boolean isGet = "GET".equals(method);
				if (isGet || "HEAD".equals(method)) {
					long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
					if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
						return;
					}
				}

				if (!mappedHandler.applyPreHandle(processedRequest, response)) {
					return;
				}

				// Actually invoke the handler.
        //实际处理器处理请求，返回结果视图对象
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

				if (asyncManager.isConcurrentHandlingStarted()) {
					return;
				}
				//结果视图对象的处理
				applyDefaultViewName(processedRequest, mv);
				mappedHandler.applyPostHandle(processedRequest, response, mv);
			}
			catch (Exception ex) {
				dispatchException = ex;
			}
			catch (Throwable err) {
				// As of 4.3, we're processing Errors thrown from handler methods as well,
				// making them available for @ExceptionHandler methods and other scenarios.
				dispatchException = new NestedServletException("Handler dispatch failed", err);
			}
      //跳转⻚⾯，渲染视图
			processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
		}
		catch (Exception ex) {
      //最终会调⽤HandlerInterceptor的afterCompletion ⽅法
			triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
		}
		catch (Throwable err) {
      //最终会调⽤HandlerInterceptor的afterCompletion ⽅法
			triggerAfterCompletion(processedRequest, response, mappedHandler,
					new NestedServletException("Handler processing failed", err));
		}
		finally {
			if (asyncManager.isConcurrentHandlingStarted()) {
				// Instead of postHandle and afterCompletion
				if (mappedHandler != null) {
					mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
				}
			}
			else {
				// Clean up any resources used by a multipart request.
				if (multipartRequestParsed) {
					cleanupMultipart(processedRequest);
				}
			}
		}
	}
```

## 三、核心步骤getHandler剖析

![img_10](https://img.zhaojq.top/20260727092021204.png "img_10")

遍历handlerMapping，获取能够处理当前请求的执行链

## 四、核心步骤getHandlerAdapter

![img_11](https://img.zhaojq.top/20260727092021413.png "img_11")

遍历各个HandlerAdapter，看哪个Adapter⽀持处理当前Handler

## 五、ha.handle方法剖析

![img_12](https://img.zhaojq.top/20260727092021640.png "img_12")

![img_13](https://img.zhaojq.top/20260727092021881.png "img_13")

![img_14](https://img.zhaojq.top/20260727092022096.png "img_14")

## 六、核⼼步骤processDispatchResult⽅法剖析

![img_15](https://img.zhaojq.top/20260727092022312.png "img_15")

![img_16](https://img.zhaojq.top/20260727092022554.png "img_16")

![img_17](https://img.zhaojq.top/20260727092022790.png "img_17")

## 七、spring mvc九大组件初始化

DispatcherServlet中9个属性（组件）

```java
/** MultipartResolver used by this servlet. */
//多部件解析器
	@Nullable
	private MultipartResolver multipartResolver;

	/** LocaleResolver used by this servlet. */
//国际化解析器
	@Nullable
	private LocaleResolver localeResolver;

	/** ThemeResolver used by this servlet. */
//主题解析器
	@Nullable
	private ThemeResolver themeResolver;

	/** List of HandlerMappings used by this servlet. */
//处理器映射器
	@Nullable
	private List<HandlerMapping> handlerMappings;

	/** List of HandlerAdapters used by this servlet. */
//处理器适配器
	@Nullable
	private List<HandlerAdapter> handlerAdapters;

	/** List of HandlerExceptionResolvers used by this servlet. */
//异常解析器
	@Nullable
	private List<HandlerExceptionResolver> handlerExceptionResolvers;

	/** RequestToViewNameTranslator used by this servlet. */
//默认视力名解析器
	@Nullable
	private RequestToViewNameTranslator viewNameTranslator;

	/** FlashMapManager used by this servlet. */
//flash属性管理组件
	@Nullable
	private FlashMapManager flashMapManager;

	/** List of ViewResolvers used by this servlet. */

//视力解析器
	@Nullable
	private List<ViewResolver> viewResolvers;
```

初始化时机

![img_18](https://img.zhaojq.top/20260727092022997.png "img_18")

![img_19](https://img.zhaojq.top/20260727092023212.png "img_19")

```java
//如果还为空，则按照默认策略生成
if (this.handlerMappings == null) {
  this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
  if (logger.isTraceEnabled()) {
    logger.trace("No HandlerMappings declared for servlet '" + getServletName() +
                 "': using default strategies from DispatcherServlet.properties");
  }
}

//从以下配置文件中找
/**
 * Name of the class path resource (relative to the DispatcherServlet class)
 * that defines DispatcherServlet's default strategy names.
 */
private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";

//
```

![img_20](https://img.zhaojq.top/20260727092023468.png "img_20")
























