Spring MVC深入学习之启动初始化过程
发布时间 - 2026-01-11 02:21:56 点击率:次前言

虽然从学java的第一个程序——helloworld至今,已经有好几个年头了。当时自己找资料,看视频,学习了java的输入输出流,多线程,网络编程等等, 而三大框架(Struts、Hibernate、Spring)基本只是开了个头就出来实习了,尤其对于Spring更是没有进行系统的学习, 虽然在实习的时候通过看项目,基本明白了spring mvc编程的框架是怎么回事,遇到需求知道如何写代码,在哪写代码,但是还是缺乏一个系统的认识。
因为最近公司项目使用 struts2 作为控制层框架,为了实现前后端分离,计划将 struts2 切换为 SpringMVC ,因此,这段时间都在学习新的框架,《Spring实战》是一本好书,里面对 Spring 的原理实现以及应用都说得很透彻,强烈推荐,但是如果想深挖 Spring 的实现,还是要从他的源码入手,这次,就先从 SpringMVC 初始化开始。
- Web 容器初始化过程
- SpringMVC的Web.xml配置
- DispatchServlet初始化
Web容器初始化过程
web容器初始化的过程,其官方文档给出了这样的描述:
- Instantiate an instance of each event listener identified by a <listener> element in the deployment descriptor.For instantiated listener instances that implement ServletContextListener, call the contextInitialized() method.
- Instantiate an instance of each filter identified by a <filter> element in the deployment descriptor and call each filter instance's init() method.
- Instantiate an instance of each servlet identified by a <servlet> element that includes a <load-on-startup> element in the order defined by the load-on-startup element values, and call each servlet instance's init() method.
其初始化的过程实际如下:
SpringMVC 的 web.xml配置
web.xml 配置代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- <listener>标签中定义了spring容器加载器
- <servlet>标签中定义了spring前端控制器
在 Servlet API中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener来处理。在ServletContextListener接口中定义了处理ServletContextEvent 事件的两个方法contextInitialized()和contextDestroyed() 。
ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置了这个监听器,启动容器时,就会默认执行它实现的方法。由于在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。
DispatchServlet初始化
在SpringMVC架构中,DispatchServlet负责请求分发,起到控制器的作用。下面详细来解释说明:
- DispatchServlet名如其义,它的本质上是一个Servlet,子类不断的对HttpServlet父类进行方法扩展
- HttpServlet有两大核心方法:init()和service()方法。HttpServletBean重写了
init()方法,在这部分,我们可以看到其实现思路:公共的部分统一来实现,变化的部分统一来抽象,交给其子类来实现,故用了abstract class来修饰类名。此外,HttpServletBean提供了一个HttpServlet的抽象实现,使的Servlet不再关心init-param部分的赋值,让servlet更关注于自身Bean初始化的实现 - FrameworkServlet提供了整合web javabean和spring application context的整合方案。在源码中可以看到通过执行
initWebApplicationContext()方法和initFrameworkServlet()方法实现 - DispatchServlet是HTTP请求的中央调度处理器,它将web请求转发给controller层处理,它提供了敏捷的映射和异常处理机制,DispatchServlet转发请求的核心代码在doService()方法中实现
DispatchServlet类和ContextLoaderListener类的关系图:
用ContextLoaderListener初始化上下文,接着使用DispatchServlet来初始化WebMVC的上下文
总结
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# springmvc初始化过程
# springmvc
# 启动初始化
# spring
# mvc
# 初始化
# idea启动springmvc项目时报找不到类的解决方法
# Spring MVC 启动过程源码分析详解
# Spring SpringMVC在启动完成后执行方法源码解析
# Spring MVC启动之HandlerMapping作用及实现详解
# 子类
# 可以看到
# 来实现
# 是一个
# 加载
# 就会
# 出了
# 都在
# 第一个
# 在这
# 中有
# 三大
# 开了
# 这段
# 用了
# 得很
# 两大
# 都说
# 写了
# 因为它
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
轻松掌握MySQL函数中的last_insert_id()
Linux系统运维自动化项目教程_Ansible批量管理实战
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
java获取注册ip实例
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel如何使用Sanctum进行API认证?(SPA实战)
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel如何使用Blade组件和插槽?(Component代码示例)
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何在IIS7上新建站点并设置安全权限?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Laravel集合Collection怎么用_Laravel集合常用函数详解
详解Huffman编码算法之Java实现
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Swift开发中switch语句值绑定模式
Laravel如何记录自定义日志?(Log频道配置)
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
UC浏览器如何设置启动页 UC浏览器启动页设置方法
WEB开发之注册页面验证码倒计时代码的实现
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
高性能网站服务器部署指南:稳定运行与安全配置优化方案
JavaScript如何实现路由_前端路由原理是什么
如何在IIS中新建站点并配置端口与物理路径?
免费网站制作appp,免费制作app哪个平台好?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel如何实现用户注册和登录?(Auth脚手架指南)
利用 Google AI 进行 YouTube 视频 SEO 描述优化
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何在IIS中新建站点并解决端口绑定冲突?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
如何在阿里云购买域名并搭建网站?
在线制作视频网站免费,都有哪些好的动漫网站?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
如何用5美元大硬盘VPS安全高效搭建个人网站?
Laravel如何为API编写文档_Laravel API文档生成与维护方法

