`

SpringMVC理解之一:应用上下文webApplicationContext

 
阅读更多
  • 一、先说ServletContext

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

    举例:

    通过自定义contextListener获取web.xml中配置的参数 1.容器启动时,找到配置文件中的context-param作为键值对放到ServletContext中 2.然后找到listener,容器调用它的contextInitialized(ServletContextEvent event)方法,执行其中的操作 例如:在web.xml中配置
    1.<context-param>
    2.<param-name>key</param-name>
    3.<param-value>value123</param-value>
    4.</context-param>
    5.<listener>
    6.<listener-class>com.brolanda.contextlistener.listener.ContextListenerTest</listener-class>
    7.</listener>
    配置好之后,在该类中获取对应的参数信息
    01.package com.brolanda.contextlistener.listener;
    02. 
    03.import javax.servlet.ServletContext;
    04.import javax.servlet.ServletContextEvent;
    05.import javax.servlet.ServletContextListener;
    06. 
    07.public class ContextListenerTest implements ServletContextListener {
    08. 
    09.public void contextDestroyed(ServletContextEvent event) {
    10.System.out.println('*************destroy ContextListener*************');
    11.}
    12. 
    13.@SuppressWarnings('unused')
    14.public void contextInitialized(ServletContextEvent event) {
    15.System.out.println('*************init ContextListener*************');
    16.ServletContext servletContext = event.getServletContext();
    17.System.out.println('key:'+servletContext.getInitParameter('key'));
    18.}
    19. 
    20.}

    执行流程:

      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作为参数名称。

    1.<context-param>
    2.<param-name>contextConfigLocation</param-name>
    3.<param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value>
    4.</context-param>
    5.<listener>
    6.<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    7.</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。
<p style= 四、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>
分享到:
评论

相关推荐

    springmvc spring 两套上下文问题

    总的来说,理解和管理Spring MVC和Spring的两套上下文是开发高质量Spring应用的重要环节。这涉及到Bean的生命周期管理、依赖注入以及不同上下文间的通信。正确配置和使用这两套上下文,能确保应用的稳定性和可维护性...

    SpringMVC中的RootApplicationContext上下文和WebApplicationContext上下文,通过注解配置SpringMVC的完整解决方案

    注解配置SpringMVC原理简述1. 准备知识1.1 两个应用上下文1.2 ServletContext配置方法(Configuration Methods)1.3 运行时插拔1.4 SpringServletContainerInitializer1.4.1 AbstractContextLoaderInitializer1.4.2 ...

    SpringMVC 处置流程分析

    tionContext)用于自定义上下文配置。然后,调用 wac.refresh()来初始化上下文,这个过程包括解析配置文件、创建Bean定义、实例化Bean、依赖注入等。...了解这一流程对于理解和优化SpringMVC应用程序的性能至关重要。

    Spring与Web环境集成.pdf

    同时,Spring还提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。 因此,我们只需要在web.xml中配置ContextLoaderListener监听器,并使用WebApplicationContextUtils获得应用上下文对象...

    深度解析springMvc

    - 在创建 `WebApplicationContext` 的过程中,会调用 `configureAndRefreshWebApplicationContext()` 方法来配置并刷新应用上下文,这是 Spring IOC 容器启动的关键步骤。 - 最终,通过调用 `onRefresh()` 方法来...

    将_Shiro_作为应用的权限基础_五:SpringMVC+Apache_Shiro+JPA(hibernate)整合配置

    - **ContextLoaderListener**:此监听器负责在Web应用程序启动时创建一个WebApplicationContext,它会自动根据`context-param`中的配置加载Spring配置文件,初始化整个应用的Spring环境。 - **...

    Spring与Web环境集成1

    在这个过程中,主要涉及的关键点是ApplicationContext应用上下文的获取和管理。 1. **ApplicationContext应用上下文获取方式**: 在非Web环境下,我们通常通过`new ClasspathXmlApplicationContext(spring配置文件...

    springmvc demo讲解

    会创建一个与Servlet相关的WebApplicationContext,这个上下文继承自根上下文,并且可以通过`init-param`中的`contextConfigLocation`参数指定其配置文件,通常是"classpath:spring/springmvc-servlet.xml"。...

    SpringMvc学习

    在Spring MVC中,一个Web应用可以有多个上下文:一个是DispatcherServlet的WebApplicationContext(通常简称为子上下文),另一个是ServletContext的根WebApplicationContext(通常称为父上下文或根上下文)。子上...

    SpringMVC中ervletContextListener的使用

    然后,我们使用`ServletContextEvent`将上下文关联到Servlet容器,并使用`ContextLoader`进行初始化。当应用程序停止时,`contextDestroyed`方法会被调用,用于关闭ApplicationContext,释放资源。 `...

    Spring Web MVC外文翻译

    - **上下文层次结构**:对于许多应用来说,拥有一个单一的 `WebApplicationContext` 即简单又足够。也可以构建上下文层次结构,其中有一个根 `WebApplicationContext` 被多个 DispatcherServlet 或其他 Servlet 实例...

    springmvc+spring

    6. **Web应用上下文**:Spring WebApplicationContext为Web应用提供了特定的上下文,能够加载与Web相关的bean,并且方便地与其他Web组件(如Servlet、Filter)进行交互。 7. **Spring Boot**:Spring Boot是基于...

    springmvc web框架 mvc模式

    这样,每个Servlet可以有自己的bean定义,同时还能覆盖父上下文中的bean。这种设计允许不同Servlet有独立的配置,同时还能共享一些全局的服务和组件。 总的来说,Spring MVC通过DispatcherServlet、HandlerMapping...

    Spring源码学习九:DispatcherServlet初始化源码分析1

    在initServletBean方法中,它会根据web.xml中的contextConfigLocation参数来构建SpringMVC的上下文环境,如果web.xml中配置了该参数,那么将会在应用启动的时候初始化一个WebApplicationContext实例,并将其保存在...

    spring在web.xml中和在struts中的不同配置..pdf

    首先,Spring的核心是ApplicationContext,它是一个管理Bean的容器,可以看作是应用程序的上下文环境。在Web应用中,我们使用的是WebApplicationContext,它是ApplicationContext的子类,专门针对Web环境进行了扩展...

    SpringMVC面试题(2020最新版).pdf

    WebApplicationContext是Spring中用于Web应用的上下文,它与普通的ApplicationContext不同,可以获取到Servlet相关的对象,如ServletContext。 总之,Spring MVC是一个强大且灵活的Web框架,通过MVC模式解耦了Web...

    SpringMVC源码剖析(二)- DispatcherServlet的前世今生1

    为此,Spring MVC引入了WebApplicationContext接口,特别是XmlWebApplicationContext,它是专门为Web应用程序设计的IoC上下文。它能够加载Web相关的配置,并在Servlet容器启动时初始化Spring MVC的组件,如...

    spring mvc jar包

    4. `org.springframework.web-3.0.2.RELEASE.jar`:这个库包含了一些 Web 相关的支持类,如 Web 应用上下文(WebApplicationContext)、HTTP 拦截器(HandlerInterceptor)和请求映射(RequestMapping)等,它们与 ...

    SpringMVC面试题(2024最新版).docx

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、...是Spring的Web环境上下文,存储了Web应用中的bean和配置信息,可以跨Servlet共享。 理解并掌握这些Spring MVC的知识点,对于面试和实际开发都至关重要。

    Spring学习笔记系列之三

    - **父容器**:主要负责应用上下文的创建,包含了所有非Web相关的Bean。它通常是通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`来创建,加载如`applicationContext.xml`这样的全局配置...

Global site tag (gtag.js) - Google Analytics