文档章节

SpringMVC中的ContextLoaderListener设计困惑

你来打我呀
 你来打我呀
发布于 2015/12/25 00:07
字数 302
阅读 204
收藏 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的呢?

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

© 著作权归作者所有

共有 人打赏支持
你来打我呀

你来打我呀

粉丝 161
博文 220
码字总数 82578
作品 0
海淀
高级程序员
私信 提问
加载中

评论(4)

你来打我呀
你来打我呀

引用来自“一万”的评论

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

引用来自“一万”的评论

我可以大概讨论一下第二个问题,楼主的翻译是对的,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

没有更多内容

加载失败,请刷新页面

加载更多

css hack

浏览器的兼容性一直是个头疼的问题,使用“欺骗”技术可使各个浏览器效果一致,花了些时间整理了各个浏览器的HACK,主要包括IE系列和最新版本的Chrome、Safari、Firefox、 Opera,比较全面的...

kitty1116
16分钟前
0
0
zookeeper脑裂问题

一、为什么zookeeper要部署基数台服务器? 二、zookeeper脑裂(Split-Brain)问题 2.1、什么是脑裂? 2.2、什么原因导致的? 2.2、zookeeper是如何解决的? 一、为什么zookeeper要部署基数台...

tantexian
22分钟前
1
0
Spring事务传播行为详解

前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的...

码代码的小司机
33分钟前
2
0
Android设备通过fastboot刷入TWRP

方法一:通过fastboot刷入TWRP的方式 首先去TWRP官网下载TWRP安装文件https://twrp.me/Devices/ 1.进入bootloader adb reboot bootloader 也可在开机时,同时按住电源键+音量减,进入bootloa...

robslove
37分钟前
0
0
为何译为“东家机”和“宾客机”

学习过虚拟化、云计算的人大概都知道,并且都在自己的电脑上安装KVM,如下图所示: 什么情况?不过是在物理机的Windows 10上安装了VMware;在VMware上安装了Linux CentOS 7操作系统;又在其上...

大别阿郎
52分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部