1. 程式人生 > >SpringMVC源碼學習之request處理流程

SpringMVC源碼學習之request處理流程

目的 攔截 使用 param urn idg return logs .html

目的:為看源碼提供調用地圖,最長調用邏輯深度為8層,反正我是springMVC源碼學習地址看了兩周才理出來的。

1.處理流程(版本為4.3.18)

入口為spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet.doService(request,respose)處理session中的flashmap springMVC源碼學習之addFlashAttribute源碼分析

-->doDispatch(request, response)主要邏輯都在這裏,創建modelandview,

----找到mappedHandler = getHandler(processedRequest),得到的mappedHandler包含一個請求的handler處理方法以及與該請求相關的所有攔截器,DispatcherServlet.getHandler方法會在底層調用HandlerMapping.getHandler(實際執行AbstractHandlerMapping.getHandler,調用抽象方法getHandlerInternal,此方法在子類org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapte.getHandlerInternal。中實現)

----HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());在使用@RequestMapping註解標註handler方法的時候,獲取到的是HandlerAdapter的
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter實現類的一個對象;DispatcherServlet.getHandlerAdapter()調用 HandlerAdapter的實現抽象類org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.supports()調用supportsInternal()執行org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.supportsInternal(return true)

----mv = ha.handle(processedRequest, response, mappedHandler.getHandler());真正執行請求,最終通過反射調用Method.invoke

調用HandlerAdapter是一個接口,HandlerAdapter.handle執行org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(request,respose,handler)

調用自己的handleInternal()執行org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal()

調用自己的方法invokeHandlerMethod()

調用org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(webRequest, mavContainer, new Object[0])得到returnValue和returnType並

調用父類spring-web-4.3.18.RELEASE.jar中org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(webRequest, mavContainer, providedArgs)

調用自己方法doInvoke(args)

調用父類org.springframework.web.method.HandlerMethod.getBridgedMethod().invoke(getBean(), args)

實際執行java.lang.reflect.Method.invoke(Clazz.newInstance(),inputParam)關於反射調用方法java reflect反射調用方法invoke;

SpringMVC源碼學習之request處理流程