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 ...
随机推荐
- 开关机安全控制!(设置进入bois的密码)
1.调整 BOIS 引导设置(1)将第一引导设备设为当前系统所在硬盘 (2)设置管理员密码 (3)进入bois后如图所示需输入bols密码才能登入
- SqlService 并发测试
使用Sql QueryStress 可输入需要的线程数量,执行次数,对SQL 语句或存储过程进行测试,可查看执行时间及资源耗用.
- Python压缩文件/文件夹
[Python压缩文件夹]导入“zipfile”模块 def zip_ya(startdir,file_news): startdir = ".\\123" #要压缩的文件夹路径 ...
- 第九届蓝桥杯B组决赛 调手表(完全背包)
问题描述 M78 星云的一个小时有 n 分钟. 大家都知道,手表只有一个按钮可以把当前的数加一.在调分钟的时候,如果当前显示的数是 0 ,那么按一下按钮就会变成 1,再按一次变成 2 .如果当前的数是 ...
- ubuntu13.10设置永久静态IP重启不失效
步骤: 1.vi打开/etc/network/interfaces 2.手动添加static ip address 3.:wq保存退出 4.重启网络 service network-manager r ...
- 第3节 Scala中的模式匹配:1 - 5
7. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 7.1 ...
- 监听EditView中的文本改变事件详解--转
转自: http://blog.csdn.net/zoeice/article/details/7700529 android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面 ...
- spring-cloud-服务调用流程
- redis5.0版本集群搭建
模式简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令,比如:mget, 因 ...
- java程序员,英语那点事
本文选自<Java程序员,上班那点事儿>有时候如果应聘到了一个有外资背景的公司或者这个公司的很多人都有海外或外资工作背景时,你 也许还会用到一些日常工作交流时候的词汇. 比如 ...