Spring-MVC理解之一:应用上下文webApplicationContext

一、先说ServletContext

  javaee标准规定了,servlet容器需要在应用项目启动时,给应用项目初始化一个ServletContext作为公共环境容器存放公共信息。ServletContext中的信息都是由容器提供的。

举例:

通过自定义contextListener获取web.xml中配置的参数

1.容器启动时,找到配置文件中的context-param作为键值对放到ServletContext中

2.然后找到listener,容器调用它的contextInitialized(ServletContextEvent event)方法,执行其中的操作

例如:在web.xml中配置

 

<context-param>
   <param-name>key</param-name>
   <param-value>value123</param-value>
</context-param>
<listener> 
   <listener-class>com.brolanda.contextlistener.listener.ContextListenerTest</listener-class>
</listener>

 

配置好之后,在该类中获取对应的参数信息

 

package com.brolanda.contextlistener.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListenerTest implements ServletContextListener {
    
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println("*************destroy ContextListener*************");
    }
    
    @SuppressWarnings("unused")
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("*************init ContextListener*************");
        ServletContext servletContext = event.getServletContext();
        System.out.println("key:"+servletContext.getInitParameter("key"));
    }
    
}

 

执行流程:

  web.xml在<context-param></context-param>标签中声明应用范围内的初始化参数

1.启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>

2.紧接着,容器创建一个ServletContext(上下文)。在该应用内全局共享。

3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.

4.容器创建<listener></listener>中的类实例,即创建监听.该监听器必须实现自ServletContextListener接口

5.在监听中会有contextInitialized(ServletContextEvent event)初始化方法

              在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
            “context-param的值” = ServletContext.getInitParameter("context-param的键");

6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.

 

web.xml中可以定义两种参数:

    一个是全局参数(ServletContext),通过<context-param></context-param>

    一个是servlet参数,通过在servlet中声明        <init-param>

                                                                          <param-name>param1</param-name>

                                                                          <param-value>avalible in servlet init()</param-value>   

                                                                    </init-param> 

 

    第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到

 

    第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得

 

二、spring上下文容器配置

  spring为我们提供了实现ServletContextListener接口的上下文初始化监听器:org.springframework.web.context.ContextLoaderListener

  spring为我们提供的IOC容器,需要我们指定容器的配置文件,然后由该监听器初始化并创建该容器。要求你指定配置文件的地址及文件名称,一定要使用:contextConfigLocation作为参数名称。

 

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 

该监听器,默认读取/WEB-INF/下的applicationContext.xml文件。但是通过context-param指定配置文件路径后,便会去你指定的路径下读取对应的配置文件,并进行初始化。

三、spring上下文容器配置后,初始化了什么?

  既然,ServletContext是由Servlet容器初始化的,那spring的ContextLoaderListener又做了什么初始化呢?

        1、servlet容器启动,为应用创建一个“全局上下文环境”:ServletContext

        2、容器调用web.xml中配置的contextLoaderListener,初始化WebApplicationContext上下文环境(即IOC容器),加载context-param指定的配置文件信息到IOC容器中。WebApplicationContext在ServletContext中以键值对的形式保存

        3、容器初始化web.xml中配置的servlet,为其初始化自己的上下文信息servletContext,并加载其设置的配置信息到该上下文中。将WebApplicationContext设置为它的父容器。

        4、此后的所有servlet的初始化都按照3步中方式创建,初始化自己的上下文环境,将WebApplicationContext设置为自己的父上下文环境。

 

 

       对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext中的内容,而反过来不行。

       当Spring在执行ApplicationContext的getBean时,如果在自己context中找不到对应的bean,则会在父ApplicationContext中去找。这也解释了为什么我们可以在DispatcherServlet中获取到由ContextLoaderListener对应的ApplicationContext中的bean。

 

 四、spring配置时:<context:exclude-filter>的使用原因,为什么在applicationContext.xml中排除controller,而在spring-mvc.xml中incloud这个controller

    既然知道了spring的启动流程,那么web容器初始化webApplicationContext时作为公共的上下文环境,只需要将service、dao等的配置信息在这里加载,而servlet自己的上下文环境信息不需要加载。故,在applicationContext.xml中将@Controller注释的组件排除在外,而在dispatcherServlet加载的配置文件中将@Controller注释的组件加载进来,方便dispatcherServlet进行控制和查找。故,配置如下:

 

applicationContext.mxl中:

 <context:component-scan base-package="com.linkage.edumanage">

      <context:exclude-filter expression="org.springframework.stereotype.Controller"    type="annotation" /> 

 </context:component-scan>

 

spring-mvc.xml中:

  <context:component-scan base-package="com.brolanda.cloud"   use-default-filters="false"> 

      <context:include-filter expression="org.springframework.stereotype.Controller"    type="annotation" /> 

 </context:component-scan>

https://www.cnblogs.com/brolanda/p/4265597.html

F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111\bin\catalina.bat run [2025-10-19 04:09:44,450] Artifact untitled3:war: Waiting for server connection to start artifact deployment... Using CATALINA_BASE: "C:\Users\ZhuanZ1\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_untitled3" Using CATALINA_HOME: "F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111" Using CATALINA_TMPDIR: "F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111" Using JRE_HOME: "C:\Program Files\Java\jdk1.8.0_202" Using CLASSPATH: "F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111\bin\bootstrap.jar;F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111\bin\tomcat-juli.jar" Using CATALINA_OPTS: "" Connected to the target VM, address: '127.0.0.1:50342', transport: 'socket' 19-Oct-2025 16:09:45.543 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.111 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Oct 10 2025 14:13:20 UTC 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 9.0.111.0 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 10 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Program Files\Java\jdk1.8.0_202\jre 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 1.8.0_202-b08 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\ZhuanZ1\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_untitled3 19-Oct-2025 16:09:45.546 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=C:\Users\ZhuanZ1\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_untitled3\conf\logging.properties 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50342,suspend=y,server=n 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -javaagent:C:\Users\ZhuanZ1\AppData\Local\JetBrains\IntelliJIdea2020.1\captureAgent\debugger-agent.jar 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote= 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.port=1099 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.ssl=false 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.password.file=C:\Users\ZhuanZ1\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_untitled3\jmxremote.password 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.access.file=C:\Users\ZhuanZ1\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_untitled3\jmxremote.access 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.rmi.server.hostname=127.0.0.1 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djdk.tls.ephemeralDHKeySize=2048 19-Oct-2025 16:09:45.547 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 19-Oct-2025 16:09:45.548 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dsun.io.useCanonCaches=false 19-Oct-2025 16:09:45.548 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dignore.endorsed.dirs= 19-Oct-2025 16:09:45.550 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=C:\Users\ZhuanZ1\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_untitled3 19-Oct-2025 16:09:45.550 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111 19-Oct-2025 16:09:45.550 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111 19-Oct-2025 16:09:45.552 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.4]加载了基于APR的Apache Tomcat本机库[1.3.1]。 19-Oct-2025 16:09:45.552 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]、UDS [true]。 19-Oct-2025 16:09:45.552 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true] 19-Oct-2025 16:09:45.557 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.0.14 4 Jun 2024] 19-Oct-2025 16:09:45.800 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 19-Oct-2025 16:09:45.817 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[493]毫秒内初始化 19-Oct-2025 16:09:45.847 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 19-Oct-2025 16:09:45.848 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/9.0.111] 19-Oct-2025 16:09:45.858 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 19-Oct-2025 16:09:45.874 信息 [main] org.apache.catalina.startup.Catalina.start [56]毫秒后服务器启动 Connected to server [2025-10-19 04:09:46,024] Artifact untitled3:war: Artifact is being deployed, please wait... 19-Oct-2025 16:09:47.079 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 19-Oct-2025 16:09:47.305 信息 [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.FrameworkServlet.initServletBean FrameworkServlet 'spring': initialization started 19-Oct-2025 16:09:47.333 信息 [RMI TCP Connection(3)-127.0.0.1] org.springframework.context.support.AbstractApplicationContext.prepareRefresh Refreshing WebApplicationContext for namespace 'spring-servlet': startup date [Sun Oct 19 16:09:47 CST 2025]; root of context hierarchy 19-Oct-2025 16:09:47.378 信息 [RMI TCP Connection(3)-127.0.0.1] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions Loading XML bean definitions from class path resource [spring-mvc.xml] 19-Oct-2025 16:09:47.954 信息 [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register Mapped "{[/hello]}" onto public org.springframework.web.servlet.ModelAndView com.springmvc.hello(java.lang.String) 19-Oct-2025 16:09:48.049 信息 [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.initControllerAdviceCache Looking for @ControllerAdvice: WebApplicationContext for namespace 'spring-servlet': startup date [Sun Oct 19 16:09:47 CST 2025]; root of context hierarchy 19-Oct-2025 16:09:48.093 信息 [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.initControllerAdviceCache Looking for @ControllerAdvice: WebApplicationContext for namespace 'spring-servlet': startup date [Sun Oct 19 16:09:47 CST 2025]; root of context hierarchy 19-Oct-2025 16:09:48.218 信息 [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.FrameworkServlet.initServletBean FrameworkServlet 'spring': initialization completed in 913 ms [2025-10-19 04:09:48,240] Artifact untitled3:war: Artifact is deployed successfully [2025-10-19 04:09:48,241] Artifact untitled3:war: Deploy took 2,217 milliseconds 19-Oct-2025 16:09:48.661 警告 [http-nio-8080-exec-1] org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI [/untitled3/] in DispatcherServlet with name 'spring' 19-Oct-2025 16:09:48.732 警告 [http-nio-8080-exec-3] org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI [/untitled3/] in DispatcherServlet with name 'spring' 19-Oct-2025 16:09:55.861 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111\webapps\manager] 19-Oct-2025 16:09:55.928 信息 [Catalina-utility-1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 19-Oct-2025 16:09:55.939 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[F:\apache-tomcat-9.0.111-windows-x64\apache-tomcat-9.0.111\webapps\manager]的部署已在[77]毫秒内完成
最新发布
10-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值