SpringMVC原始碼學習之request處理流程 springMVC原始碼學習地址 springMVC原始碼學習之addFlashAttribute原始碼分析 java reflect反射呼叫方法invoke
目的:為看原始碼提供呼叫地圖,最長呼叫邏輯深度為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;