• SpringMVC源码学习之request处理流程


    目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的。

    建议看完后还比较晕的,参照这个简单的模型深入底层,仿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(),RequestContextUtils.getInputFlashMap(request)可以获取到request中的attribute,且将所有的request中的attribute放置在mavContainer中,modelFactory.initModel()会将@ModelAttribute方法调用一遍,并且将相关的MV放到mavContainer,invokeAndHandle()执行conroller中的方法

    调用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;

  • 相关阅读:
    asp.net获取站点根目录下子目录的名称
    asp.net在网站根目录下创建文件夹
    HoverTree.Model.ArticleSelect类的作用
    HoverTree系统源码介绍
    ASP.NET中Request.RawUrl、Request.Url的区别
    汇编语言-环境搭建
    IDEA快速返回上次代码的位置
    一级建造师
    4000块DIY组装电脑
    职称申报
  • 原文地址:https://www.cnblogs.com/pu20065226/p/10145129.html
Copyright © 2020-2023  润新知