处理器适配器的详细处理过程

​ 当把需要的处理器和适配器找到之后-下面就开始执行具体的处理过程了-通过下述代码进行调用:

``plain mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); `

找到RequestMappingHandlerAdapter的类中

`java @Override protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { // 先声明ModelAndView结果 ModelAndView mav; // 检查请求是否支持-1、通过supportedMethods方法判断是否包含请求方法-2、检查请求中是否包含session checkRequest(request); // Execute invokeHandlerMethod in synchronized block if required. // 处理时是否对session加锁-默认为false if (this.synchronizeOnSession) { // 获取session对象 HttpSession session = request.getSession(false); // 对session是否为空做判断-如果不等于空 if (session != null) { // 获取session中锁对象 Object mutex = WebUtils.getSessionMutex(session); // 加锁后执行调用处理器方法逻辑 synchronized (mutex) { mav = invokeHandlerMethod(request, response, handlerMethod); } } else { // No HttpSession available -> no mutex necessary // 没有session-则忽略加所-直接执行调用处理器方法逻辑 mav = invokeHandlerMethod(request, response, handlerMethod); } } else { // No synchronization on session demanded at all... mav = invokeHandlerMethod(request, response, handlerMethod); } // 如果响应结果不包含缓存控制头 if (!response.containsHeader(HEADER_CACHE_CONTROL)) { // 如果该处理器方法包含sessionAttribute if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) { // 应哟个sessionAttributes的缓存策略 applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers); } else { //不包含SessionAttribute-准备请求。内部逻辑应用配置的缓存策略-本适配器默认没有缓存策略-故所有请求都不返回缓存响应头 prepareResponse(response); } } // 返回结果 return mav; } `

1、mav = invokeHandlerMethod(request, response, handlerMethod);

`java @Nullable protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { // 把请求和响应封装为一个ServletWebRequest对象 ServletWebRequest webRequest = new ServletWebRequest(request, response); try { // 创建WebDataBinderFactory工厂-该工厂用于获取处理器方法对应的WebDataBinder组件 WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod); // 获取当前处理器方法对应的Model工厂-该工厂用于获取处理器方法对应的model ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory); // 创建一个Servlet下可调用处理器的方法-内部创建了一个ServletInvocableHandlerMethod对象 ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod); //设置参数解析器 if (this.argumentResolvers != null) { invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); } // 设置返回值处理器 if (this.returnValueHandlers != null) { invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); } // 设置DataBinder工厂 invocableMethod.setDataBinderFactory(binderFactory); // 设置参数名获取器-用于获取方法上的参数名 invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer); // 创建用于处理过程中使用的ModelAndView容器 ModelAndViewContainer mavContainer = new ModelAndViewContainer(); // 向MV容器中添加FlashMap的属性 mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request)); // 初始化Model-包含调用Model相关的初始化方法-如ModelAttribute注解标记的方法 modelFactory.initModel(webRequest, mavContainer, invocableMethod); //在重定向时忽略默认的Model属性值-只考虑重定向Model的属性值-默认为true mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect); // 准备异步相关的处理 AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response); asyncWebRequest.setTimeout(this.asyncRequestTimeout); WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); asyncManager.setTaskExecutor(this.taskExecutor); asyncManager.setAsyncWebRequest(asyncWebRequest); asyncManager.registerCallableInterceptors(this.callableInterceptors); asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors); if (asyncManager.hasConcurrentResult()) { Object result = asyncManager.getConcurrentResult(); mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0]; asyncManager.clearConcurrentResult(); LogFormatUtils.traceDebug(logger, traceOn -> { String formatted = LogFormatUtils.formatValue(result, !traceOn); return "Resume with async result [" + formatted + "]"; }); invocableMethod = invocableMethod.wrapConcurrentResult(result); } // 调用处理器方法并处理返回值 invocableMethod.invokeAndHandle(webRequest, mavContainer); if (asyncManager.isConcurrentHandlingStarted()) { return null; } // 获取MV结果 return getModelAndView(mavContainer, modelFactory, webRequest); } finally { // 标记请求完成 webRequest.requestCompleted(); } } `

##### 1、WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMe