SpirngMVC源码简析
2020/3/8 17:01:56
本文主要是介绍SpirngMVC源码简析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本人学习过程中参考了其他博客,做了一些笔记在有道云中,忘记保存原博客地址,作者看到可联系本人,本人核实后加上,谢谢。 本人目前水平有限,后期深入学习后会补上不足的地方,感谢阅览。
SpirngMVC流程综述
- 用户发送请求至前端控制器
DispatcherServlet
。 - DispatcherServlet收到请求调用
HandlerMapping
处理器映射器。 - 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给
DispatcherServlet
。 - DispatcherServlet调用
HandlerAdapter
处理器适配器。 - HandlerAdapter经过适配调用具体的处理器(
Controller
,也叫后端控制器)。 - Controller执行完成返回
ModelAndView
。 - HandlerAdapter将controller执行结果ModelAndView返回给
DispatcherServlet
。 - DispatcherServlet将ModelAndView传给
ViewReslover
视图解析器。 - ViewReslover解析后返回具体
View
。 - DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。
以下开始源码分析
xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- SpringMVC前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> 复制代码
从DispatcherServlet中进入源码,选中DispatcherServlet,在eclipse中按F4
会发现,其实DispatcherServlet是继承了HttpServlet的,我们都知道HttpServlet 的生命周期是先实例化,初始化,处理请求,销毁,在初始化时是执行HttpServlet的init()
方法,处理请求执行HttpServlet的service()
或doGet
或doPost
方法,销毁是执行HttpServlet的destory()
方法。
init()方法
下面我们来看看init()
方法中SpringMVC干了什么
最终发现init()
是在HttpServletBean
类中,并且是final修饰的方法,说明子类中是不存在其他init()
方法,在init()方法中调用了initServletBean()
,按住CTRL+鼠标左键点击进入查看子类FrameworkServlet
的实现。
在FrameworkServlet
的initServletBean()
方法中调用了initWebApplicationContext()
方法,查看其源码
- 518行:
WebApplicationContext
是Spring容器,得到Spring容器rootContext
- 524行:得到SpringMVC容器
wac
- 533行:将rootContext设置为wac的父容器,所有很多人说
Spring是SpringMVC的父容器
其他暂不考虑,有兴趣自行了解
service()方法
下面我们来看看service()
方法都干了什么。
service()
方法通过调用processRequest()
方法放行请求,processRequest()
方法实际是调用了doService()
方法
- 867行:声明Map集合
- 874行:给Map集合插入值
- 880行:给request设置值
- 893行:最终调用
doDispatch()
方法
- 939行:
HandlerAdapter
在DispatcherServlet
中调用 其他先忽略
这篇关于SpirngMVC源码简析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升