首页 > 编程语言 >Spring MVC 源码分析 - WebApplicationContext 容器的初始化

Spring MVC 源码分析 - WebApplicationContext 容器的初始化

时间:2024-01-02 20:32:12浏览次数:27  
标签:WebApplicationContext 初始化 Spring wac 源码 context Servlet

随着 Spring Boot 和 Spring Cloud 在许多中大型企业中被普及,可能你已经忘记当年经典的 Servlet + Spring MVC 的组合,是否还记得那个 web.xml 配置文件。在开始本文之前,请先抛开 Spring Boot 到一旁,回到从前,一起来看看 Servlet 是怎么和 Spring MVC 集成,怎么来初始化 Spring 容器的,在开始阅读本文之前,最好有一定的 Servlet 和 Spring IOC 容器方面的知识,比较容易理解

概述

在开始看具体的源码实现之前,我们先一起来看看现在“陌生”的 web.xml 文件,可以查看我的另一篇 MyBatis 使用手册 文档中集成 Spring小节涉及到的 web.xml 的文件,部分内容如下:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <display-name>Archetype Created Web Application</display-name>

    <!-- 【1】 Spring 配置 -->
    <!-- 在容器(Tomcat、Jetty)启动时会被 ContextLoaderListener 监听到,
         从而调用其 contextInitialized() 方法,初始化 Root WebApplicationContext 容器 -->
    <!-- 声明 Spring Web 容器监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- Spring 和 MyBatis 的配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mybatis.xml</param-value>
    </context-param>

    <!-- 【2】 Spring MVC 配置 -->
    <!-- 1.SpringMVC 配置 前置控制器(SpringMVC 的入口)
         DispatcherServlet 是一个 Servlet,所以可以配置多个 DispatcherServlet -->
    <servlet>
        <!-- 在 DispatcherServlet 的初始化过程中,框架会在 web 应用 的 WEB-INF 文件夹下,
             寻找名为 [servlet-name]-servlet.xml 的配置文件,生成文件中定义的 Bean. -->
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置需要加载的配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- 程序运行时从 web.xml 开始,加载顺序为:context-param -> Listener -> Filter -> Structs -> Servlet
             设置 web.xml 文件启动时加载的顺序(1 代表容器启动时首先初始化该 Servlet,让这个 Servlet 随 Servlet 容器一起启动)
             load-on-startup 是指这个 Servlet 是在当前 web 应用被加载的时候就被创建,而不是第一次被请求的时候被创建  -->
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <!-- 这个 Servlet 的名字是 SpringMVC,可以有多个 DispatcherServlet,是通过名字来区分的
             每一个 DispatcherServlet 有自己的 WebApplicationContext 上下文对象,同时保存在 ServletContext 中和 Request 对象中
             ApplicationContext(Spring 容器)是 Spring 的核心
             Context 我们通常解释为上下文环境,Spring 把 Bean 放在这个容器中,在需要的时候,可以 getBean 方法取出-->
        <servlet-name>SpringMVC</servlet-name>
        <!-- Servlet 拦截匹配规则,可选配置:*.do、*.action、*.html、/、/xxx/* ,不允许:/* -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

【1】 处,配置了 org.springframework.web.context.ContextLoaderListener 对象,它实现了 Servlet 的 javax.servlet.ServletContextListener 接口,能够监听 ServletContext 对象的生命周期,也就是监听 Web 应用的生命周期,当 Servlet 容器启动或者销毁时,会触发相应的 ServletContextEvent 事件,ContextLoaderListener 监听到启动事件,则会初始化一个Root Spring WebApplicationContext 容器,监听到销毁事件,则会销毁该容器

【2】 处,配置了 org.springframework.web.servlet.DispatcherServlet 对象,它继承了 javax.servlet.http.HttpServlet 抽象类,也就是一个 Servlet。Spring MVC 的核心类,处理请求,会初始化一个属于它的 Spring WebApplicationContext 容器,并且这个容器是以 【1】 处的 Root 容器作为父容器

  • 为什么有了 【2】 创建了容器,还需要 【1】 创建 Root 容器呢?因为可以配置多个 【2】 呀,当然,实际场景下,不太会配置多个 【2】 

    标签:WebApplicationContext,初始化,Spring,wac,源码,context,Servlet
    From: https://blog.51cto.com/u_15668812/9072740

相关文章

  • 用源码烹饪美味:同城上门做饭APP技术实践全揭秘
    同城上门做饭APP为用户提供了更为个性化的美食体验。这篇文章,小编将与大家深入揭秘同城上门做饭APP的技术实践,探讨其背后的技术原理与实际开发中的关键挑战。 一、技术架构同城上门做饭APP的技术架构至关重要。在前端,采用先进的移动应用框架,确保用户在不同设备上都能流畅使用。而......
  • Spring Boot 自动配置功能介绍
    SpringBoot自动配置功能介绍SpringBoot是一个流行的Java开发框架,它提供了许多便利的功能和工具,帮助开发者快速构建应用程序。其中一个最引人注目的特性是其强大的自动配置功能。什么是自动配置?在传统的Java开发中,我们通常需要手动配置应用程序的各个组件和依赖项。这可......
  • 医院安全(不良)事件报告系统源码 支持二次开发
    医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语,使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验,根据医疗不良事件的事件类型、处理事件的不同部门,灵活设置上报模板和填报项目,对患者的影响、事后处理......
  • 2023安卓期末大作业-记事本app(可以登录,含完整源码+程序设计报告+运行视频+apk导出文件
    2023安卓期末大作业-记事本app(可以登录,含完整源码+程序设计报告+运行视频+apk导出文件)打包文件如下图所示:基于Android系统的简单记事本,它能够便携记录生活和工作的诸多事情,从而帮助人们有条理的进行时间管理。一个记事本,能够输入标题和内容,创建日期、最新修改日期等信息。如果没......
  • 安卓期末大作业-记账app(含源码+导出app+运行截图)安卓期末大作业-记账app(含源码+导出ap
    安卓期末大作业-记账app(含源码+导出app+运行截图)开发软件:AndroidStudio开发语言:Java2023年上半年移动开发期末大作业记账app,老师给了95分,可以记录各种类型的账目支出记录,收入记录,存储到数据库中,可以隐藏账目记录,可以记录和删除记录,还可以将收支记录转图表分析,也可清空所有数据。具......
  • 全网最新整理覆盖全平台电脑、手机的7个开源免费流媒体直播平台以及完整源码和文档
    全网最新整理覆盖全平台电脑、手机的7个开源免费流媒体直播平台以及完整源码和文档。如今上到太空站、下到在家养猪,各行各业都在直播。直播之所以如此盛行,就是因为其能够给粉丝观众亲临现场的感受,以及直播过程中所附带着巨大的经济效益。这种方式可以为无法亲自到场的人表演、分享......
  • netty源码:(38)ByteToMessageDecoder类
    ByteToMessageDecoder是一个解码器,是一个ChannelInboundHandlerAdapter,它用来将ByteBuf中的字节流解析成另外的消息格式。它的核心方法是decode,decode方法的in参数表示接收字节的来源,out参数表示节码之后输出的目的地。比如,StringDecoder继承了ByteToMessageDecoder,它的decod......
  • netty源码:(40)ReplayingDecoder
    ReplayingDecoder是ByteToMessageDecoder的子类,我们继承这个类时,也要实现decode方法,示例如下:packagecn.edu.tju;importio.netty.buffer.ByteBuf;importio.netty.channel.ChannelHandlerContext;importio.netty.handler.codec.ReplayingDecoder;importjava.nio.charset.C......
  • 【JDK新特性】JDK和Springboot各版本新特性介绍
    目录参考资料以下是一些较新版本的JDK的主要新特性介绍:JDK8:Lambda表达式:引入了函数式编程的概念,使得代码更简洁、可读性更强。StreamAPI:提供了一种高效处理集合数据的方式,支持并行处理。默认方法(DefaultMethods):接口可以包含具有默认实现的方法。方法引用(MethodReferences):通过......
  • 记录 | ubuntu源码编译python3.7.3(指定版本)
    一、安装依赖包sudoapt-getinstall-ymakebuild-essentiallibssl-devzlib1g-devsudoapt-getinstall-ylibbz2-devlibreadline-devlibsqlite3-devwgetcurlllvmsudoapt-getinstall-ylibncurses5-devlibncursesw5-devxz-utilstk-dev二、从Python网页中找......