当前位置:首页 > 移动开发 > 正文

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取出。