在Web应用中,我们会用到WebApplicationContext 用它来保存上下文信息
那么它set到ServletContext的过程是怎么样呢
1)通过WEB.XML中监听类
p.p1 { margin: 0; font: 11px Monaco }
span.s1 { color: rgba(0, 145, 147, 1) }
span.s2 { color: rgba(78, 145, 146, 1) }
p.p1 { margin: 0; font: 11px Monaco }
触发contextInitialized方法
再来看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public
WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
if
(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) !=
null``) {
throw
new
IllegalStateException(
"Cannot initialize context because there is already a root application context present - "
+
"check whether you have multiple ContextLoader* definitions in your web.xml!"``);
}
Log logger = LogFactory.getLog(ContextLoader.``class``);
servletContext.log(``"Initializing Spring root WebApplicationContext"``);
if
(logger.isInfoEnabled()) {
logger.info(``"Root WebApplicationContext: initialization started"``);
}
long
startTime = System.currentTimeMillis();
try
{
// Store context in local instance variable, to guarantee that
// it is available on ServletContext shutdown.
if
(``this``.context ==
null``) {
this``.context = createWebApplicationContext(servletContext);
}
最后一行,又调用了createWebApplicationContext方法,我们再来看一下这个方法的代码:
1
2
3
4
5
6
7
8
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);
}
通过代码可知,在这里返回了一个ConfigurableWebApplicationContext,再来看一下contextLoader的initWebApplicationContext方法中最关键的代码:
1
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
this``.context);
在这里把context存入servletContext中,所以以后要用到WebApplicationContext的时候可以从servletContext取出。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章