SpringMVC的源码解析
发布时间 - 2026-01-10 22:56:04 点击率:次学习java的人都知道spring,springMVC,mybatis等框架,像structs2这样的框架是基于servlet以外实现的,而springMVC是基于servlet容器实现的,

本文将分析SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程,让读者了解这个入口Servlet的作用。
在分析DispatcherServlet之前,我们先看下DispatcherServlet的继承关系,
HttpSerlvetBean继承自HttpServlet。
HttpServletBean覆写了init方法,对初始化过程做了一些处理。 以下是初始化的代码:
首先,ServletConfigPropertyValues是HttpServletBean的静态类,构造过程会使用ServletConfig对象找出web.xml文件中配置参数,并设置到ServletConfigPropertyValue,使用BeanWrapper来构造DispatcherServlet, 获取ServletContextResourceLoader的资源加载器,然后注册资源编辑器,初始化BeanWrapper对象,设置DispatcherServlet属性,默认初始化ServletBean不做任何处理,子类覆盖该方法可以做任何事情,
以下是web.xml文件配置:
这段配置初始化参数为contextConfigLocation,后来构造的是BeanWrapper对象, 由于contextConfigLocation在FrameworkServlet中定义,但是没有在HttpServletBean中定义,利用Spring的注入特性,只需要调用setContextConfigLocation方法,就可以将contextConfigLocation设置到对应的实例当中,然后设置DispatcherServlet中contextConfigLocation(FrameworkServlet中定义)的属性,为web.xml读取contextConfigLocation参数,该资源文件用构造SpringMVC的容器的上下文。
下面看下FrameworkServlet这个类,FrameworkServlet继承自HttpServletBean。
以下是initServletBean的代码:
首先第一步是初始化WebApplicationContext,它是继承于ApplcationContext的接口,ApplcationContext是Spring容器的上下文,Servlet和Spring容器关联的作用,然后初始化FrameWorkServlet,其实它空的,什么也做,子类重写这个方法,可以做任何处理,不过DispatcherServlet并重写这个方法。
下面是初始化initWebApplicationContext的具体实现逻辑:
首先,得到根路径,DistpatcherServlet有个WebApplication为参数的构造函数,如果注入了WebApplication 这个对象,就会执行上图代码。
FrameworkServlet中有个String类型的contextAttribute的变量名,以它为key在ServletContextWebApplicationContext,一般不会设置,contextAttribute属性,也就说,wac开始是null;接下来就是创建WebApplicationContext,并设置根上下文为父上下文,然后配置ServletConfig,ServletContext等到这个上下文,这个类中有个函数onReFresh是一个模版方法,在WebApplication成功创建后就会调用,FrameworkServlet的实现类,就会重写这个方法,并将创建的容器上下文设置到ServletContext中,这里的根上下文是web.xml中配置的ContextLoaderListener监听器中根据contextConfigLocation路径生成的上下文。
比如这段配置文件中根据classpath:context-*.xml下的xml文件生成的根上下文。
接着看一下DispatcherServlet重写了FrameworkServlet中onReFresh方法,
可以看到initStrategies方法中,在初始化各种各种策略接口的实现类, 后面再一一分析各个策略接口的实现的详细介绍。
总结一个三个类的作用:
HttpServletBean 主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。
FrameworkServlet 将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。
DispatcherServlet 主要是初始化一些各个策略接口的实现。比如请求处理,试图处理。处理的适配等。
DispatcherServlet请求处理过程:
先看下HttpServlet提供的方法用于处理请求,service使用了模版模式,对于HttpServlet的get请求,调用doGet方法,post请 求,调用doPost方法........
在看下处理processRequest函数
首先,获取于当前线程绑定的LocaleContext和ServletRequestAttributes对象,initContextHoers函数就是让新构造的LocaleContex和requestAttributes进行关联,这个关联使用ThreadLocal完成,doService方法是抽象方法,具体由DispatcherServlet实现。
最后调用resetContextHolders函数重置LocaleContext和RequestAttribute对象,解除LocaleContext和RequestAttribute对象的绑定。执行成功后,发布ServletRequestHandlerEvent事件,可以通过注册监听器来监听该事件的发布。注册的监听器类型为ApplicationListener接口类型。
接下来是DispatcherServlet的doService方法.
如果该请求是include的请求,那么保留一份快照版本的request域中的数据,doDispatch方法之后,这个快照版本的数据将会覆盖新的Requet域的数据。
然后在request中设置一些属性,最后doDispatcher进行请求分发处理。
doDispatch方法功能大致过程如下:
首先根据请求的路径,通过RequestMapping的注解映射,找到HandlerMethod(也就是对应Controller中的方法),然后匹配路径对应的拦截器,有了HandlerMethod和拦截器构造个HandlerExecutionChain对象。HandlerExecutionChain对象的获取是通过HandlerMapping接口提供的方法中得到。
有了HandlerExecutionChain之后,通过handlerAdapter对象进行适配处理,得到ModelAndView对象,HandlerMethod内部handle的时候,使用各种HandlerMethodArgumentResolver实现类处理HandlerMethod的参数,使用各种HandlerMethodReturnValueHandler实现类处理返回值,最终返回值被处理成一个ModelAndView对象,这期间发生的异常会被HandlerExceptionResolver接口实现类进行处理.
总结: 本文主要分析DispatcherServlet及其父类FrameworkServlet和HttpServletBean它们的作用。以及一个请求到处理返回,大致过程的分析。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# SpringMVC
# Spring+SpringMVC+JDBC实现登录的示例(附源码)
# Spring MVC 启动过程源码分析详解
# SpringMVC源码解析之消息转换器HttpMessageConverter
# Spring SpringMVC在启动完成后执行方法源码解析
# spring MVC cors跨域实现源码解析
# 从源码角度看spring mvc的请求处理过程
# 有个
# 就会
# 重写
# 子类
# 这段
# 写了
# 绑定
# 先看
# 返回值
# 的是
# 是一个
# 拦截器
# 将会
# 是基于
# 它是
# 的人都
# 可以通过
# 并将
# 可以看到
# 详细介绍
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
如何获取PHP WAP自助建站系统源码?
Android使用GridView实现日历的简单功能
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何快速搭建高效服务器建站系统?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel安装步骤详细教程_Laravel环境搭建指南
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何确认建站备案号应放置的具体位置?
如何安全更换建站之星模板并保留数据?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
青岛网站建设如何选择本地服务器?
JavaScript如何实现路由_前端路由原理是什么
微信小程序 require机制详解及实例代码
C++用Dijkstra(迪杰斯特拉)算法求最短路径
jquery插件bootstrapValidator表单验证详解
移动端脚本框架Hammer.js
Android 常见的图片加载框架详细介绍
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
b2c电商网站制作流程,b2c水平综合的电商平台?
如何快速登录WAP自助建站平台?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
中国移动官方网站首页入口 中国移动官网网页登录
高端建站三要素:定制模板、企业官网与响应式设计优化
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
javascript中对象的定义、使用以及对象和原型链操作小结
php结合redis实现高并发下的抢购、秒杀功能的实例
如何在七牛云存储上搭建网站并设置自定义域名?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
网站制作壁纸教程视频,电脑壁纸网站?
海南网站制作公司有哪些,海口网是哪家的?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
如何快速重置建站主机并恢复默认配置?
phpredis提高消息队列的实时性方法(推荐)
上一篇: 制作简易网站,mic是什么浏览器?
上一篇: 制作简易网站,mic是什么浏览器?

