文档章节

SpringMVC中的ContextLoaderListener设计困惑

华兹格
 华兹格
发布于 2015/12/25 00:07
字数 302
阅读 206
收藏 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...

听柳
2018/05/31
0
0
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
深入分析Spring 与 Spring MVC容器

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

陶邦仁
2015/10/30
0
5

没有更多内容

加载失败,请刷新页面

加载更多

Navicat使用教程:使用Navicat Premium 12自动执行数据库复制(二)

下载Navicat Premium最新版本 Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。 与...

电池盒
26分钟前
1
0
简单聊聊Linux学习经历

学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为...

linux-tao
26分钟前
1
0
如何才能从程序员成长为实战型架构师?必掌握这7大实战技能经验

想成为一名架构师,但是架构师对应的技能,我应该掌握哪些啊?以及掌握的程度是什么样的?如何成为一名真正的实战性架构师? 我简要分为以下7点来谈谈,从技能的角度抛砖引玉,希望你对你架构...

mikechen优知
37分钟前
2
0
vue里实现echarts中国地图

echartsDemo.vue <template> <div> <div id="chart_example"></div> </div></template><script> // 首先要 cnpm install echarts import echarts from 'echarts' import ......

Danni3
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部