WebApplicationContext

在Web应用中,我们会用到WebApplicationContext  用它来保存上下文信息

 

那么它set到ServletContext的过程是怎么样呢

 

1)通过WEB.XML中监听类

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
span.s1 { color: #009193 }
span.s2 { color: #4e9192 }

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 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取出。