一、ServletContext
addListener(..) 方法,也有创建的方法 createListener(Class<T> c)
addFilter(..) 方法,也有创建的方法。
可以获取路径,也可以获取其中的Servlet。可以获取资源,获取文件的MIME类型等等。
 
二、ServletContextListener
在ServletContext发生Event时,接收Event通知。
有两个方法:
// 在ServletContext进行初始化时执行。是在任何filter或者Servlet初始化之前。
public void contextInitialized(ServletContextEvent sce); // 在ServletContext销毁时执行。是在所有的filter和Servlet销毁之后进行。
public void contextDestroyed(ServletContextEvent sce);
 
三、org.springframework.web.context.ContextLoader
public class ContextLoader
文档描述如下:
  执行root application context的实际初始化工作。由ContextLoaderListener调用。
  会先去查找web.xml中context-param级别的contextClass参数,该参数指定了context class类型,如果找不到,会使用XmlWebApplicationContext。
  默认情况下,所有context class都需要实现ConfigurableWebApplicationContext。(除非自行写了一个新的ContextLoader,见下面的代码第三行)
     protected WebApplicationContext createWebApplicationContext(ServletContext sc) {
Class<?> contextClass = determineContextClass(sc);
if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
"] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]");
}
return (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
}
  处理context-param的contextConfigLocation参数,传值给context实例,解析成多个文件路径(该参数可以使用逗号和空格设置多个值)。支持Ant风格。
  如果没指定,使用context class中默认的位置。例如,XmlWebApplicationContext使用 /WEB-INF/applicationContext.xml 。
 
  除了加载root application context之外,这个class还可以加载或获取并勾连到一个共享的父context。--就是给这个context设置一个父context。
 
 
四、现在再来看org.springframework.web.context.ContextLoaderListener
public class ContextLoaderListener extends ContextLoader implements ServletContextListener
文档描述如下:
  Bootstrap listener to start up and shut down Spring's root WebApplicationContext. Simply delegates to ContextLoader as well as to ContextCleanupListener. 
  引导监听器,用于启动和关闭Spring的根WebApplication上下文。
 
注意,该类除了两个构造方法之外,就只有重写了的ServletContextListener接口的两个方法。
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
public ContextLoaderListener() {
} public ContextLoaderListener(WebApplicationContext context) {
super(context);
} @Override
public void contextInitialized(ServletContextEvent event) {
initWebApplicationContext(event.getServletContext());
} @Override
public void contextDestroyed(ServletContextEvent event) {
closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
} }
就是说,当ServletContext初始化时,会执行contextInitialized(..),然后 initWebApplicationContext(..)
  -- 这个方法【initWebApplicationContext(..)】先会去创建一个webApplicationContext,并设置父context(可能)。然后配置并刷新这个webApplicationContext,并将其以【WebApplicationContext.class.getName() + ".ROOT"】为key设为servletContext的属性。
 
 
那个带参构造是什么意思,什么情况需要通过webApplicationContext来构造?? -- 进入了一个思维盲区!该构造的目的是通过listener实例来注册listener(而非通过类名)。
带参构造的官方文档:
  使用给定的application context创建一个新的ContextLoaderListener。
  在Servlet 3.0+ 环境中有用。
  通过listener实例来注册listener(而非通过类名),见 javax.servlet.ServletContext.addListener 。
 
配合 initWebApplicationContext(..) 中的这个判断就明白了:
if (this.context == null) {
this.context = createWebApplicationContext(servletContext);
}
就是说,如果已有application context,就不再创建,直接使用已有的。但是该设置的一样设置。
 
总结:
ContextLoaderListener 这个类的作用是,通过监听创建并设置WebApplicationContext。嗯,记住,这是一个ServletContext监听器。
 
 

ContextLoader,ContextLoaderListener解读的更多相关文章

  1. Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle

    到目前为止,已经看了一百页.再次感慨下,如果想使用Spring,那可以看视频或者找例子,但如果想深入理解Spring,最好还是看官方文档. 原计划是把一些基本接口的功能.层次以及彼此的关系罗列一下.同 ...

  2. Spring的监听器ContextLoaderListener

    一.作用 ContextLoaderListener监听器的作用就是启动web容器时,自动装配ApplicationContext的配置信息.它实现了ServletContextListener接口, ...

  3. Spring MVC源码——Root WebApplicationContext

    目录 Spring MVC源码--Root WebApplicationContext 上下文层次结构 Root WebApplicationContext 初始化和销毁 ContextLoaderL ...

  4. Spring MVC 解读——<context:component-scan/>

    转自:http://my.oschina.net/HeliosFly/blog/203149 作者:GoodLoser. Spring MVC 解读---<context:component-s ...

  5. Spring源码情操陶冶-ContextLoader

    前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-ContextLoaderListener 静态代码块内容 ContextLoader在被主动调用的时候,会执行其的一个静态块,代码 ...

  6. Spring源码情操陶冶-ContextLoaderListener

    前言:通过实例结合源码的方式解读,其中涉及到的文件来自于博主的Github毕设项目wxServer Note: Springboot应用不在本文章讨论范围 web.xml中启用Spring 在一般的w ...

  7. SpringMVC 原理 - 设计原理、启动过程、请求处理详细解读

    SpringMVC 原理 - 设计原理.启动过程.请求处理详细解读 目录 一. 设计原理 二. 启动过程 三. 请求处理 一. 设计原理 Servlet 规范 SpringMVC 是基于 Servle ...

  8. [Spring框架] Spring中的 ContextLoaderListener 实现原理.

    前言: 这是关于Spring的第三篇文章, 打算后续还会写入AOP 和Spring 事务管理相关的文章, 这么好的两个周末 都在看code了, 确实是有所收获, 现在就来记录一下. 在上一篇讲解Spr ...

  9. contextloaderlistener

    http://blog.csdn.net/c5153000/article/details/6234207 作用:在启动Web容器时,自动装配Spring applicationContext.xml ...

随机推荐

  1. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  2. synthesis-of-weak-property-only-allowed-in-arc-or-gc-mode ARC属性

    synthesis-of-weak-property-only-allowed-in-arc-or-gc-mode ARC属性 错误提示: 1:确认你的项目是 ARC环境: 2:如果 ARC下出现上面 ...

  3. 【Linux】cd命令

    用途 cd命令的主要作用是变换目录 全称 cd的全称是Change Directory   案例 以下是一些基础的cd命令操作(酒红色字体为命令 ,蓝色字体为解释字体) [root@bigdata ~ ...

  4. Spring 基于Aspectj切面表达式

    package com.proc; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; im ...

  5. LeetCode-344:Reverse String

    This  is a  "Pick One" Problem :[Problem:344-Reverse String] Write a function that takes a ...

  6. 面面具到!android重力传感器

    前两篇都是向大家介绍了很有意思的两种手势操作,嵌入我们游戏中,不得不说让游戏的自由度.可玩性和趣味性都增色不少!那么今天继续给大家介绍一亮点!传感器! 一:什么是传感器: 所谓传感器能够探测如光.热. ...

  7. dubbox rest协议jackson 反序列化的坑

    dubbox 相对于dubbo 对了 rest 协议的支持  而且默认序列化的协议 是json dubbox 内部是通过 RestEasy 处理 rpc 服务 而 RestEasy获取序列化是 是通过 ...

  8. 从 &quot;org.apache.hadoop.security.AccessControlException:Permission denied: user=...&quot; 看Hadoop 的用户登陆认证

    假设远程提交任务给Hadoop 可能会遇到 "org.apache.hadoop.security.AccessControlException:Permission denied: use ...

  9. mysql多实例安装详解

    首先说明一个场景:我的电脑是ubuntu系统,之前apt-get自动安装过mysql.这也是出现错误最多的原因之一. 安装过程,其中充斥着各种错误: 6.mkdir mysql 7.groupadd  ...

  10. java的装箱拆箱是什么?

    是什么? 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱. 为什么 把 ...