.

1.1 init(初始化)
在第一次发出请求时,会调用HttpServletBean 的init()方法 org.springframework.web.servlet.HttpServletBean.init() //读取配置文件,初始化等操作
 org.springframework.web.servlet.FrameworkServlet.initServletBean() //初始化ServletBean
  this.webApplicationContext = initWebApplicationContext(); //初始化上下文
   org.springframework.web.servlet.DispatcherServlet.onRefresh(wac); //刷新上下文,包括初始化策略等
    initStrategies(context); //初始化各个策略
     initMultipartResolver(context);
     initLocaleResolver(context);
     initThemeResolver(context);
     initHandlerMappings(context);
     initHandlerAdapters(context);
     initHandlerExceptionResolvers(context);
     initRequestToViewNameTranslator(context);
     initViewResolvers(context);
     initFlashMapManager(context);
  initFrameworkServlet(); //初始化Servlet 1.2 发出请求
org.springframework.web.servlet.FrameworkServlet.doGet() //发出get请求,走此方法
 processRequest() //get和post请求都走这个方法,通过org.springframework.web.context.request.RequestContextHolder中的ThreadLocal的成员变量获取上下文信息,完了把最新的上下文信息设置到ThreadLocal中
  doServise() //设置一系列SpringMVC相关的请求参数:request.setAttribute
   org.springframework.web.servlet.DispatcherServlet.doDispatch() //DispatcherServlet核心方法,根据请求获取对应的Controller,对请求做分发处理,控制器得到结果,通过mav处理,再继续渲染返回给前端
    HandlerExecutionChain mappedHandler = getHandler(request) //根据请求获取对应的控制器(从IOC容器中通过bean名字获取),包括拦截器等等(这里处理了跨域)
     org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler()
      org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandlerExecutionChain() //得到系统中的拦截器,并返回处理器链
      org.springframework.web.servlet.handler.AbstractHandlerMapping.getCorsHandlerExecutionChain() //先判断请求头,再得到系统中的跨域拦截器
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal() //处理请求:到了Controller中
     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal() //处理请求:到了Controller中
      org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle() //到Controller中处理请求并得到参数
      org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue() //处理请求参数,如果参数的类型符合直接返回的类型,则会在这里直接响应

来点文字的东西吧

1.SpringMVC是由一个DispatcherServlet对所有的请求进行分发的;

2.SpringMVC会初始化每个Controller的信息,通过HandlerMapping接口,和请求的url,找到应该用哪个Controller的哪个方法,并且还要处理拦截器等;

3.得到HandlerMapping之后,判断选择使用哪个HandlerAdapter,这个HandlerAdapter就拥有了执行Controller方法的全部内容了,执行完成之后返回数据或者ModelAndView;

4.最后如果是数据则返回,如果是ModelAndView,则通过其解析器渲染,然后返回。

.

SpringMVC一点简单地源码解析的更多相关文章

  1. KBEngine简单RPG-Demo源码解析(1)

    一:环境搭建1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载          下载服务端源码(KBEngine):              https://github.com ...

  2. servlet-servlet的简单认识——源码解析

    Servlet的基本认识 本内容主要来源于<看透Spring MVC源码分析与实践——韩路彪>一书 Servlet是server+Applet的缩写,表示一个服务器的应用.Servlet其 ...

  3. KBEngine简单RPG-Demo源码解析(2)

    七:服务端资产库文件夹结构http://kbengine.org/cn/docs/concepts/directorys.html看assets, 注意:demo使用的不是默认的assets资产目录, ...

  4. KBEngine简单RPG-Demo源码解析(3)

    十四:在世界中投放NPC/MonsterSpace的cell创建完毕之后, 引擎会调用base上的Space实体, 告知已经获得了cell(onGetCell),那么我们确认cell部分创建好了之后就 ...

  5. SpringMVC源码解析- HandlerAdapter - ModelFactory(转)

    ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...

  6. springMVC源码解析--ViewResolver视图解析器执行(三)

    之前两篇博客springMVC源码分析--ViewResolver视图解析器(一)和springMVC源码解析--ViewResolverComposite视图解析器集合(二)中我们已经简单介绍了一些 ...

  7. 设计模式-简单工厂Coding+jdk源码解析

    感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...

  8. 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析

    简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...

  9. SpringMVC源码解析- HandlerAdapter - ModelFactory

    ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...

随机推荐

  1. 安装插件报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++

    起因:学到多线程greenlet模块时,greenlet模块死活装不上,以为pycharm坏掉了,浪费了一下午. #pip3 install greenlet from greenlet import ...

  2. 「HAOI2011」Problem c

    「HAOI2011」Problem c 传送门 由于这道题本人讲得不好,可以参考这位dalao的博客 我可就直接上代码了... 参考代码: /*---------------------------- ...

  3. 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in position 38: invalid continuation by

    1.windows中安装虚拟环境virtualenv时, 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in po ...

  4. Vue学习笔记:v-bind 属性动态绑定

    v-bind 的作用 v-bind指令可以将节点的属性与动态表达式绑定在一起 v-bind可以绑定html元素中的各种属性 例如: <a v-bind:href="xxx"& ...

  5. urllib 库的代替品 requests 的用法

    Requuests 官方的介绍时多么的霸气,之所以那么霸气,是因为 Requestts 相比于 urllib 在使用方面上会让开发者感到更加的人性化.更加简洁.更加舒适,并且国外的一些公司也在使用re ...

  6. nginx 的请求处理阶段

    nginx处理的11个阶段 nginx处理用户请求的流程 接收用户请求头部之后 1 .匹配对应得location 2.是否进行限速 3.验证用户是否有权限访问该资源:和判断是否是盗链的请求 4.生成用 ...

  7. LXML解析html代码和文件

    from lxml import etree text = """ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  8. Struts2学习(六)

    拦截器原理 1.如图所示,Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一 ...

  9. 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法

    6.    类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1.   类 6.1.1.    类的定义 package cn.itcast ...

  10. Linux进程管理(一)

    目录 Linux进程管理(一) 参考 pstree命令 pidof命令 pmap命令 pwdx命令 ps命令 nice调优 发送信号 Linux进程管理(一)