Web容器啟動時加載Spring

 

在應用程序web.xml中做瞭以下配置信息時,當啟動Web容器時就會自動加載Spring容器。

 

<listener> 

 

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

 

</listener> 

ContextLoaderListener類實現瞭javax.servlet.ServletContextListener接口並且繼承瞭org.springframework.web.context.ContextLoader類。ServletContextListener事件類是Web容器的一部分,處理Web應用的Servlet上下文(context)的監聽。實現ServletContextListener接口中的contextInitialized和contextDestroyed方法。當Web容器啟動時會自動調用contextInitialized方法,進行初始化Spring Web應用程序上下文,主要加載web.xml中contextConfigLocation的配置文件;當Web容器關閉之前會調用contextDestroyed方法,進行銷毀Spring Web應用程序上下文。ContextLoader類實現瞭Spring上下文初始化的工作,執行initWebApplicationContext方法返回WebApplicationContext。Spring實現的contextInitialized和contextDestroyed代碼如下:

 

public void contextInitialized(ServletContextEvent event) { 

 

       this.contextLoader = createContextLoader(); 

 

       if (this.contextLoader ==null) { 

 

           this.contextLoader = this; 

 

       } 

 

    this.contextLoader.initWebApplicationContext(event.getServletContext()); 

 

    } 

 

  

 

public void contextDestroyed(ServletContextEvent event) { 

 

       if (this.contextLoader !=null) {       

 

this.contextLoader.closeWebApplicationContext(event.getServletContext()); 

 

 

 ContextCleanupListener.cleanupAttributes(event.getServletContext()); 

 

  

Spring執行實現Spring上下文的方法

 

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); 

 

            } 

 

            if (this.context instanceof ConfigurableWebApplicationContext) { 

 

                configureAndRefreshWebApplicationContext((ConfigurableWebApplicationContext)this.context, servletContext); 

 

            } 

 

            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,this.context); 

 

  

 

            ClassLoader ccl = Thread.currentThread().getContextClassLoader(); 

 

            if (ccl == ContextLoader.class.getClassLoader()) { 

 

                currentContext = this.context; 

 

            } 

 

            else if (ccl != null) { 

 

                currentContextPerThread.put(ccl, this.context); 

 

            } 

 

  

 

            if (logger.isDebugEnabled()) { 

 

                logger.debug("Published root WebApplicationContext as ServletContext attribute with name [" + 

 

                        WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]"); 

 

            } 

 

            if (logger.isInfoEnabled()) { 

 

                long elapsedTime = System.currentTimeMillis() – startTime; 

 

                logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms"); 

 

            } 

 

  

 

            return this.context; 

 

        } 

 

        catch (RuntimeException ex) { 

 

            logger.error("Context initialization failed", ex); 

 

            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex); 

 

            throw ex; 

 

        } 

 

        catch (Error err) { 

 

            logger.error("Context initialization failed", err); 

 

            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err); 

 

            throw err; 

 

        } 

 

    }   

飄藍

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *