SpringMVC一点简单地源码解析
.
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一点简单地源码解析的更多相关文章
- KBEngine简单RPG-Demo源码解析(1)
一:环境搭建1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载 下载服务端源码(KBEngine): https://github.com ...
- servlet-servlet的简单认识——源码解析
Servlet的基本认识 本内容主要来源于<看透Spring MVC源码分析与实践——韩路彪>一书 Servlet是server+Applet的缩写,表示一个服务器的应用.Servlet其 ...
- KBEngine简单RPG-Demo源码解析(2)
七:服务端资产库文件夹结构http://kbengine.org/cn/docs/concepts/directorys.html看assets, 注意:demo使用的不是默认的assets资产目录, ...
- KBEngine简单RPG-Demo源码解析(3)
十四:在世界中投放NPC/MonsterSpace的cell创建完毕之后, 引擎会调用base上的Space实体, 告知已经获得了cell(onGetCell),那么我们确认cell部分创建好了之后就 ...
- SpringMVC源码解析- HandlerAdapter - ModelFactory(转)
ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...
- springMVC源码解析--ViewResolver视图解析器执行(三)
之前两篇博客springMVC源码分析--ViewResolver视图解析器(一)和springMVC源码解析--ViewResolverComposite视图解析器集合(二)中我们已经简单介绍了一些 ...
- 设计模式-简单工厂Coding+jdk源码解析
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
- 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析
简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...
- SpringMVC源码解析- HandlerAdapter - ModelFactory
ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...
随机推荐
- 用java代码打印九九乘法表
package com.wf; public class cal { public static void main(String[] args) { for(int i=1;i<10;i++) ...
- CentOS7配置python3教程
环境准备: 1.python3.7.1 下载地址:https://www.python.org/ 注意:CentOS7默认就有python2的 2.虚拟机CentOS 7 64位,下载地址:ht ...
- Activiti工作流学习笔记一
Activiti工作流 一:Activiti第一天 1:工作流的概念 说明: 假设:这两张图就是华谊兄弟的请假流程图 图的组成部分: 人物:范冰冰冯小刚王中军 事件(动作):请假.批准.不批准 工作流 ...
- 2 JavaScript输出&字面量&变量&操作符&语句&标识符和关键字&字符集&语句&数据类型与类型转换
JS输出: JavaScript没有任何打印或者输出的函数,但是可以用不同的方式输出数据 window.alert():弹出警告框 document.write():写入文档 innerHTML:写入 ...
- Cortex-M3学习小结
- linux命令系列-mv(移动-重命名)
#常用命令选项 默认覆盖 -n 不覆盖 -i 交互 -f 不交互直接覆盖 -u 只移动新的文件 -v 显示详细信息 #移动覆盖3个文件到/tmp目录 mv a.txt b.txt c.txt /tmp ...
- 手搓SSM
相关资料,网上的资料很多,但是文章看不懂,看别人写好的代码比较好理解 ssm-example mysssm 整个流程和原理 一个入口类,入口类需要在tomcat启动的时候执行 通过扫描文件加把文件取出 ...
- mybatis typealias 问题
最近在学mybatis 在一个简单的问题上却花了挺长时间 网上也没发现有类似的案例 故记录一下 在configuration里面 typealias 和 properties 同时用会出错 具体原因 ...
- 133、Java获取main主函数参数
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 编写安全 PHP 应用程序的七个习惯
编写安全 PHP 应用程序的七个习惯 在提及安全性问题时,需要注意,除了实际的平台和操作系统安全性问题之外,您还需要确保编写安全的应用程序.在编写 PHP 应用程序时,请应用下面的七个习惯以确保应 ...