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;

猜你喜欢

转载自www.cnblogs.com/pu20065226/p/10145129.html