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容器初始化的过程,其官方文档给出了这样的描述:

  1. 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.
  2. Instantiate an instance of each filter identified by a <filter> element in the deployment descriptor and call each filter instance's init() method.
  3. 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


相关推荐: Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  C语言设计一个闪闪的圣诞树  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  制作旅游网站html,怎样注册旅游网站?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel怎么实现模型属性的自动加密  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Android利用动画实现背景逐渐变暗  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  JavaScript如何实现继承_有哪些常用方法  如何自定义建站之星网站的导航菜单样式?  做企业网站制作流程,企业网站制作基本流程有哪些?  如何快速搭建支持数据库操作的智能建站平台?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  利用vue写todolist单页应用  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Python文件操作最佳实践_稳定性说明【指导】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel怎么调用外部API_Laravel Http Client客户端使用  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  百度浏览器如何管理插件 百度浏览器插件管理方法  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  如何快速搭建高效WAP手机网站?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  如何用花生壳三步快速搭建专属网站?  什么是javascript作用域_全局和局部作用域有什么区别?  如何快速打造个性化非模板自助建站?  如何在腾讯云免费申请建站?  在centOS 7安装mysql 5.7的详细教程  如何用PHP快速搭建高效网站?分步指南  Laravel如何记录自定义日志?(Log频道配置)  实例解析Array和String方法  魔方云NAT建站如何实现端口转发?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何用已有域名快速搭建网站?  如何实现建站之星域名转发设置?  在Oracle关闭情况下如何修改spfile的参数  微信小程序 闭包写法详细介绍  Laravel怎么为数据库表字段添加索引以优化查询  如何在阿里云服务器自主搭建网站?  手机网站制作与建设方案,手机网站如何建设?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  JavaScript模板引擎Template.js使用详解  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何用JavaScript实现文本编辑器_光标和选区怎么处理