zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/pu20065226/p/10145129.html
Copyright © 2011-2022 走看看