一、先说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/lizhonghua34/p/4729171.html

应用上下文webApplicationContext相关推荐

  1. Spring思维导图(MVC篇)

    写在前面 生活就像海洋,只有意志坚强的人才能到达彼岸. 已经很久没有发文章了呀,想必大家都挂念我了,哈哈. 温故而知新,今天一起来复习一下spring mvc的内容吧. spring mvc简介与运行 ...

  2. 【Spring】DispatcherServlet的启动和初始化

    使用过SpringMVC的都知道DispatcherServlet,下面介绍下该Servlet的启动与初始化.作为Servlet,DispatcherServlet的启动与Serlvet的启动过程是相 ...

  3. Spring思维导图,让Spring不再难懂(mvc篇)

    转载自 Spring思维导图,让Spring不再难懂(mvc篇) spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的 ...

  4. Spring系列(六) Spring Web MVC 应用构建分析

    DispatcherServlet DispatcherServlet 是Spring MVC的前端控制器名称, 用户的请求到达这里进行集中处理, 在Spring MVC中, 它的作用是为不同请求匹配 ...

  5. Spring Framework--SpringMVC(1)--DispatcherServlet

    Spring web MVC和其他的web MVC框架一样,由请求驱动,围绕一个中心Servlet来进行设计,中心Servlet负责把请求派发给控制器(Controller),还提供其他的功能方便we ...

  6. Spring MVC 教程,快速入门,深入分析【转】

    2019独角兽企业重金招聘Python工程师标准>>> 转自:赵磊 地址:http://elf8848.iteye.com 目录  一.前言 二.spring mvc 核心类与接口 ...

  7. java代码启动spring_从0开始学JAVA之《Spring框架-启动过程》

    本文是以初学者角度记录学习JAVA过程,无指导之意,如有错误,请各位大神不吝指教. 希望能够通过文章编写监督自我上进,与初学者共勉!!!上篇文章我们已经初步认识 Spring 框架,接下来我们结合实际 ...

  8. spring mvc 思想

    目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说 ...

  9. Spring源码分析之SpringMVC的DispatcherServlet是如何处理Http请求的

    一般我们会在web.xml文件中配置DispatcherServlet,比如如下配置方式: <servlet><servlet-name>dispatcherServlet&l ...

最新文章

  1. C#图片灰度处理(位深度24→位深度8),用灰度数组byte[]新建一个8位灰度图像Bitmap 。...
  2. Android构建流程——篇六
  3. gis怎么通过水库划分子流域_ArcGIS提取小流域——以北京为例,提取出密云水库...
  4. linux禁止切换到root,linux禁止普通用户切换至root用户的实例讲解
  5. 第二十一章流 5 多种打开文件的方式 文件存在,文件不存在
  6. 【转】WEB前端调优
  7. 通过mysql show processlist 命令检查mysql锁的方法
  8. 高可用的Redis主从复制集群,从理论到实践
  9. (十七)Java springcloud B2B2C o2o多用户商城 springcloud架构-消息驱动 Spring Cloud Stream...
  10. 非越狱逆向开发总结文档(含iOS Extension)
  11. 《图书管理系统》需求分析
  12. python实现onvif客户端及问题小结
  13. sublime教程以及python环境的配置(二)常用插件安装和Boxy主题配置
  14. linux设置北京时间
  15. C# winform 魔兽MH全图制作教程(1): 开发准备工作
  16. Ubuntu上安装Firefox浏览器
  17. 计算二叉树中各结点的最大元素的值
  18. 北京奥运会赛事电视直播表(绝对完整)--每天就抱着电视看吧!
  19. 云服务器怎么做成文件共享系统,怎样实现云服务器文件共享
  20. 电脑开不了机怎么办?如何解决?

热门文章

  1. 获取用户之间关系——使用followerway
  2. 【.Net Micro Framework PortingKit – 12】SysTick驱动开发
  3. Linux经典实用的使用技巧33则和常用60个命令
  4. DataTable方法 和 性能
  5. [BZOJ2738]矩阵乘法
  6. 机器学习博主推荐、博文推荐
  7. luogu P1659 [国家集训队]拉拉队排练
  8. 【线性代数】向量空间
  9. POJ 2106 Boolean Expressions (布尔表达式求值)
  10. hdu1372 Knight Moves BFS 搜索