springmvc项目在启动完成之后执行一次方法_学习笔记21-springmvc部分源码学习
SpringMVC:请求处理流程
这几张图讲的大致都是一个东西,就是springmvc的请求处理流程:
① 用户发送请求到springmvc框架提供的DispatcherServlet 这个前端控制器
② 前端控制器会去找处理器映射器(HandlerMapping),处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet 。
③ 根据处理器映射器返回的处理器,DispatcherServlet 会找“合适”的处理器适配器(HandlerAdapter)
④ 处理器适配器HandlerAdpater会去执行处理器(Handler开发的时候会被叫成Controller也叫后端控制器) 执行之前会有转换器、数据绑定、校验器等等完成上面这些才会去正在执行Handler
⑤ 后端控制器Handler执行完成之后返回一个ModelAndView对象
⑥ 处理器适配器HandlerAdpater会将这个ModelAndView返回前端控制器DispatcherServlet。前端控制器会将ModelAndView对象交给视图解析器ViewResolver。
⑦ 视图解析器ViewResolver解析ModelAndView对象之后返回逻辑视图。
⑧ 前端控制器DispatcherServlet对逻辑视图进行渲染(数据填充)之后返回真正的物理View并响应给浏览器。
DispatcherServlet:前端控制器,也叫主控制器,在web项目的web.xml文件中配置,继承结构:
HttpServletBean:重写了init方法,主要是做一些初始化的工作,将web.xml中的参数设置到servlet中,
代码中ServletConfigPropertyValues是HTTPServletBean的静态内部类
FrameworkServlet:是HttpServletBean的的子类,重写了init()方法。将 Servlet 上下文与 Spring 容器上下文关联。其实也就是初始化 FrameworkServlet 的属性webAppkicationContext,这个属性代表Springmvc上下文对象,实际类型是ConfigurableWebApplicationContext。如果使用了spring,那么就有个父容器,即web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。
查看最后的refresh方法:
obtainFreshBeanFactory方法:
loadBeanDefinitions:
loadBeanDefinitions方法:
loadBeanDefinitions方法:
loadBeanDefinitions:
doLoadBeanDefinitions
registerBeanDefinition
doRegisterBeanDefinition
parseBeanDefinition
parseDefaultElement
processBeanDefinition
parseBeanDefinitionElement
springmvc中配置文件的bean标签以及属性等会被解析之后封装到AbstractBeanDefinition对象。
DispatcherServlet
initStrategies
到此springmvc的IOC容器创建完成,各种组件也初始化完成。
HandlerMapping:根据当前请求找到对应的Handler(Controller后端控制器),并将Handler与一堆HandlerInterceptor封装到HandlerExecutionChain对象中。
在HandlerMapping接口中只有一个方法:getHandler(HttpServletRequest request);
在initStrategies方法中有initHandlerMappings(context)用来初始化HandlerMapping。
同样的,HandlerAdapter和ViewResolver也都是在initStrategies方法中初始化的。
HandlerMapping接口的实现类和继承结构
AbstractHandlerMapping:
AbstractHandlerMethodMapping:
上述代码中 lookupHandlerMethod() 方法主要工作是在 Map<T, HandlerMethod>
handlerMethods 中找到 HandlerMethod,这里的 T 是 HandlerMappingInfo,它封装了
@RequestMapping 注解中的信息。
AbstractUrlHandlerMapping:
HandlerAdapter:springmvc中使用适配器模式来解决不同的Handler的执行,根据Handler来找到对应的HandlerAdapter,通过处理器适配器执行Handler得到ModelAndView对象。
HandlerAdapter接口中的两个主要方法:
继承结构:红线划掉的子类表示已经过时不再使用。
AbstractHandlerMethodAdapter:
RequestMappingHandlerAdapter:实际上就是执行@RequestMapping注解
HttpRequestHandlerAdapter:
SimpleControllerHandlerAdapter:
SimpleServletHandlerAdapter:
ViewResolver:1.根据视图的名称找到对应的物理视图将其封装为view对象,2.View对视图 进行渲染和数据填充等展示给用户
ViewResolver接口的结构:
AbstractCachingViewResolver:
ResourceBundleViewResolver:ResourceBundleViewResolver 根据 views.properties 文件来解析视图
XmlViewResolver:XmlViewResolver 根据 xml 文件来解析视图
UrlBasedViewResolver:UrlBasedViewResolver 提供了拼接 URL 的方式来解析视图,通过 prefix 属性拼接一个前缀,通过suffix属性拼接一个后缀,就得到了视图的URL。还可以加入redirect:(调用HttpServletResponse对象的sendRedirect()方法)和forward:(使用RequestDispatcher的forward方式进行跳转)前缀,另外,使用时还要指定viewClass属性,表示要解析成哪种View。
InternalResourceViewResolver:InternalResourceViewResolver是UrlBasedViewResolver的子类,将InternalResourceViewResolver作为默认的View类,但是如果当前的classpath中有jstl的jar包,则使用JstlView作为view进行渲染。
View接口:视图渲染器,在该接口中定义了渲染视图的抽象方法。将 Model 中的数据放到 HttpServletRequest 中传递 jsp。
结构:
springmvc项目在启动完成之后执行一次方法_学习笔记21-springmvc部分源码学习相关推荐
- springmvc项目在启动完成之后执行一次方法_SpringMVC运行原理
springMVC主要有四大控件,其中有DispatcherServlet,hadlerMapping,HanlerAdapter,ModelAndView. springMVC的运行步骤大致是当客服 ...
- springmvc项目在启动完成之后执行一次方法_SpringMVC源码分析
一 SpringMVC运行原理 二 SpingMVC源码分析 1 DispatcherServlet 1.1 DispatcherServlet继承结构 ServletConfig对象获取Init标签 ...
- spring启动后自动执行一次方法
说明 spring启动后自动执行一次方法:因为需要保证所有调度相关的依赖注入spring容器才创建所以定时调度任务,所以需要实现在Spring容器将所有的Bean都初始化完成之后才自动执行一次执行方法 ...
- ASP.NET Core MVC 源码学习:MVC 启动流程详解
前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...
- java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)
原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...
- GitHub 上 1.3k Star 的 strman-java 项目有值得学习的地方吗?源码视觉来分析一波
大家好,我是沉默王二. 很多初学编程的同学,经常给我吐槽,说:"二哥,你在敲代码的时候会不会有这样一种感觉,写着写着看不下去了,觉得自己写出来的代码就好像屎一样?" 这里我必须得说 ...
- php连接tidb,TiDB源码学习笔记:启动TiDB
作者:院长,神州数码云基地开发工程师,目前专注于TiDB源码研究. TiDB源码研究系列第一篇,简述TiDB的核心架构,从tidb-server/mian.go开始,探索启动TiDB的方法. 最近因为 ...
- 【Android 源码学习】 init启动
目录 Android 源码学习 init启动 从main.cpp开始 init.cpp 部分逻辑 init启动zygote 属性服务 总结 Android 源码学习 init启动 Android 11 ...
- 【Android 源码学习】系统架构和启动流程
Android 源码学习 系统架构和启动流程 望舒课堂 学习记录整理.以及以下参考文章的整理汇总.便于我个人的学习记录. 感谢IngresGe,Gityuan的精彩文章.为我们这些初探android系 ...
最新文章
- 联想服务器 重装系统u盘启动,联想_Lenovo BIOS Setup Utility 设置U盘启动教程
- mysql Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona
- python类库31[文件和目录os+os.path+shutil]
- 磁珠 符号_贴片磁珠功能_贴片磁珠应用
- python合并excel工作簿_Python合并多个Excel工作簿
- 解释器模式(行为模式)
- 用V C++检测和隔离内存泄漏
- CMake file文件操作命令
- HDU-6341 Problem J. Let Sudoku Rotate(dfs 剪枝)
- Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
- ros之TF坐标转换
- image 微信小程序flex_微信小程序进阶-flex布局
- 利用python批量处理Word文件——正文、标题
- 在Word中为三位数字设置带圈字符(转)
- Android开发之获取GPS位置案例源码详解
- 【人工生态系统优化算法】基于人工生态系统优化算法求解单目标优化问题附matlab代码
- OMEN惠普HP暗夜精灵5:win10下安装Ubuntu16.04双系统(win10+linux)
- vscode卡在Setting up SSH Host XX:Copying VS Code Server to host with scp
- 沟通的技巧--爱因斯坦如何向老太太解释相对论
- daocloud mysql_DaoCloud Services 开放 API
热门文章
- SOAP-ERROR: Parsing WSDL: failed to load external entity怎么办?
- HTML CSS基本语法
- html页面加载蒙版_javascript 窗口加载蒙板 内嵌网页内容
- 锈才学设计模式之 —— 策略模式(Strategy Pattern)
- Mysql发生Incorrect string value: ‘\xE5\x90\x8D\xE7\xA7\xB0‘异常
- 敬伟PS学习笔记(一)
- 第2次作业:软件案例分析之王者荣耀
- 【北亚数据恢复】异常断电导致linux服务器无法启动,数据库损坏的数据恢复
- 【sqoop】job作业
- java基础(六)线程