文档章节

SpringMVC中的ContextLoaderListener设计困惑

hanzhankang
 hanzhankang
发布于 2015/12/25 00:07
字数 302
阅读 203
收藏 6

最近在学习Spring MVC原理相关部分,就按顺序从ContextLoaderListener来看,但是我在阅读此类的设计中,遇到了些困惑的地方,现纪录如下,希望能遇到高手能帮我答疑解惑:

ContextLoaderListener 类的定义:

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
	private ContextLoader contextLoader;
	public ContextLoaderListener() {
	}

	public ContextLoaderListener(WebApplicationContext context) {
		super(context);
	}

	public void contextInitialized(ServletContextEvent event) {
		this.contextLoader = createContextLoader();
		if (this.contextLoader == null) {
			this.contextLoader = this;
		}
		this.contextLoader.initWebApplicationContext(event.getServletContext());
	}

	@Deprecated
	protected ContextLoader createContextLoader() {
		return null;
	}

	@Deprecated
	public ContextLoader getContextLoader() {
		return this.contextLoader;
	}

	public void contextDestroyed(ServletContextEvent event) {
		if (this.contextLoader != null) {
			this.contextLoader.closeWebApplicationContext(event.getServletContext());
		}
		ContextCleanupListener.cleanupAttributes(event.getServletContext());
	}

}



困惑一:

ContextLoaderListener类已经继承了ContextLoader,为何又声明了一个私有的ContextLoader类的 对象属性contextLoader?而这个 contextLoader 在上下文的 意义愚以为仅仅是显示的说明 contextLoader 其实就是"this"。(我仿照ContextLoaderListener写了个去掉contextLoader属性的类,容器正常启动

困惑二:

ContextLoaderListener doc注释为:

Bootstrap listener to start up and shut down Spring's root {@link WebApplicationContext}...

Spring's root {@link WebApplicationContext},可以翻译为Spring的 顶级/根 WebApplicationContext吗?那是否有非root的呢?

也许我比较愚钝没能发现其中的奥秘,也可能我比较较真,非要打破沙锅问到底,思考了许久,还希望大牛能帮我答疑解惑。

© 著作权归作者所有

共有 人打赏支持
hanzhankang

hanzhankang

粉丝 158
博文 220
码字总数 82578
作品 0
海淀
高级程序员
加载中

评论(4)

hanzhankang
hanzhankang

引用来自“一万”的评论

第一个问题,不是很明白了,猜想是不是有历史原因?因为与之相关的两个方法都被标注了过期。
请问楼主看的是哪个版本的源码?
我刚才查看了4.2.3版本的源码ContextLoaderListener里已经没有ContextLoader类的成员变量了。标注了过期的两个方法也被移除了。
我的还是3.2.4,4.2.3现在还没有推。谢谢您哈!真赞!
hanzhankang
hanzhankang

引用来自“一万”的评论

我可以大概讨论一下第二个问题,楼主的翻译是对的,ContextLoaderListener创建的是根应用上下文。

Spring framework可以创建一个或者多个应用上下文。一个应用上下文管理一组bean。这些上下文是可以有层次结构的,比如可以将applicationContext1设置为applicationContext2的父,子上下文可以访问父以上的上下文中的bean,而反过来不能访问。

ContextLoaderListener创建的根应用上下文是所有应用上下文的父。

一个常见的例子是Spring MVC 的DispatcherServlet 会创建自己的一个应用上下文,它可以访问到ContextLoaderListener创建的应用上下文中的bean,而根上下文却访问不到DispatcherServlet创建的应用上下文中的bean。所以DispatcherServlet可以访问到在ContextLoaderListener中注入的数据库相关的bean,而ContextLoaderListener应用上下文却访问不到DispatcherServlet创建的Controller、Service等bean。
赞!确实有父子关系,你得回答醍醐灌顶!
一万
一万
第一个问题,不是很明白了,猜想是不是有历史原因?因为与之相关的两个方法都被标注了过期。
请问楼主看的是哪个版本的源码?
我刚才查看了4.2.3版本的源码ContextLoaderListener里已经没有ContextLoader类的成员变量了。标注了过期的两个方法也被移除了。
一万
一万
我可以大概讨论一下第二个问题,楼主的翻译是对的,ContextLoaderListener创建的是根应用上下文。

Spring framework可以创建一个或者多个应用上下文。一个应用上下文管理一组bean。这些上下文是可以有层次结构的,比如可以将applicationContext1设置为applicationContext2的父,子上下文可以访问父以上的上下文中的bean,而反过来不能访问。

ContextLoaderListener创建的根应用上下文是所有应用上下文的父。

一个常见的例子是Spring MVC 的DispatcherServlet 会创建自己的一个应用上下文,它可以访问到ContextLoaderListener创建的应用上下文中的bean,而根上下文却访问不到DispatcherServlet创建的应用上下文中的bean。所以DispatcherServlet可以访问到在ContextLoaderListener中注入的数据库相关的bean,而ContextLoaderListener应用上下文却访问不到DispatcherServlet创建的Controller、Service等bean。
OPEN SESSION IN VIEW配置

使用Hibernate/Spring/Struts架构,配置使用Spring的OpenSessionInView Filter,但是发现不生效,lazy的集合属性在页面访问的时候仍然报session已经关闭的错误。我和他一起检查了所有的配置和...

红番茄
2012/05/07
0
0
Spring mvc 和 CXF 搭建SOAP环境

最近用Spring mvc框架搭建web工程,后因为业务需要重新需要在原有web工程基础上,添加Webservice接口。这就涉及到一个问题: 在spring mvc 配置文件中如何添加一些WS框架。在添加之初发现一个...

long0419
2014/01/14
0
1
spring mvc 配置失效了?

版本:spring 3.0以上 项目中有两个spring的配置xml,如下 项目中的web.xml web.xml的配置如下: 1、ContextLoaderListener加载applicationContext-service-database.xml 2、DispatcherServl...

听柳
05/31
0
0
深入分析Spring 与 Spring MVC容器

Spring经典详解 Spring事务机制详解 Spring配置事务五种方式 关于Spring加载classpath与classpath*的过程剖析 深入分析Spring 与 Spring MVC容器 Spring系列文章 【第1章 Spring概述与结构】...

陶邦仁
2015/10/30
0
5
Spring MVC启动过程(1):ContextLoaderListener初始化

Spring MVC启动过程 以Tomcat为例,想在Web容器中使用Spirng MVC,必须进行四项的配置: 修改web.xml,添加servlet定义、编写servletname-servlet.xml(servletname是在web.xm中配置Dispact...

LiJIaming
2012/06/11
0
6

没有更多内容

加载失败,请刷新页面

加载更多

Bash各类扩展详解

Bash各类扩展详解 Bash中主要包括大括号扩展、波浪号扩展、变量扩展、子命令扩展、文件名扩展和算数扩展。这些扩展组合在一起为Bash带来了极大的易用性。掌握这些扩展的用法和功能,能够为B...

小陶小陶
40分钟前
1
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
1
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
1
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部