真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringMVC的上下文在Web容器中的啟動是怎樣的

這篇文章給大家介紹Spring MVC的上下文在Web容器中的啟動是怎樣的,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)武漢,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

Web環(huán)境下的MVC

Spring IoC是一個獨立的模塊,并不能直接在Web容器中發(fā)揮作用。

所以要在Web容器中使用IoC容器,需要為Spring IoC設(shè)計一個啟動過程,并把IoC容器導(dǎo)入進來

Web容器的啟動過程一方面處理Web容器的啟動,另一方面將IoC容器載入到web環(huán)境中并將其初始化

Spring MVC是建立在IoC容器的基礎(chǔ)上的,在導(dǎo)入IoC容器后才能建立MVC

上下文在Web容器中的啟動過程

在常見的web.xml中需要配置一個DispatcherServlet類型的servlet和一個ContextLoaderListener類型的listener

Spring MVC通過這兩個類在Web容器中建立MVC,并將創(chuàng)建好的容器放到ServletContext

ContextLoaderListener用于實現(xiàn)Spring IoC的啟動,創(chuàng)建IoC容器作為"根容器"

DispatcherServlet創(chuàng)建另一個IoC容器,并與根容器搭建雙親容器,完成MVC的建立

ContextLoaderListener調(diào)用方法contextInitialized()實現(xiàn)IoC容器的啟動

DispatcherServlet調(diào)用父類的init()方法創(chuàng)建IoC容器和搭建雙親容器,以搭建好的IoC容器為基礎(chǔ)建立MVC

創(chuàng)建根上下文

initWebApplicationContext()方法的實現(xiàn)在ContextLoaderListener的父類ContextLoader

public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
    // 如果ServletContext已經(jīng)存在根容器,說明已經(jīng)創(chuàng)建過根容器,就不需要再執(zhí)行下面的流程
    if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
        throw ...
    }

    try {
        if (this.context == null) {
            // 創(chuàng)建容器
            this.context = createWebApplicationContext(servletContext);
        }
        if (this.context instanceof ConfigurableWebApplicationContext) {
            ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context;
            // 如果容器沒有被初始化過就執(zhí)行以下流程
            if (!cwac.isActive()) {
                if (cwac.getParent() == null) {
                    // Spring5以后此方法直接返回null值
                    ApplicationContext parent = loadParentContext(servletContext);
                    cwac.setParent(parent);
                }
                // 執(zhí)行容器的refresh()方法刷新容器
                configureAndRefreshWebApplicationContext(cwac, servletContext);
            }
        }
        // 將容器作為根容器。以指定常量為key,容器為value將其添加到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);
        }

        return this.context;
    }
    catch (Error err) {
        throw err;
    }
}

在DispatcherServlet中創(chuàng)建IoC容器

init() —— initServletBean() —— initWebApplicationContext()

initWebApplicationContext()方法的實現(xiàn)在DispatcherServlet的父類FrameworkServlet

protected WebApplicationContext initWebApplicationContext() {
    // 從ServletContext中獲取根容器
    WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    
    WebApplicationContext wac = null;

    // 默認this.webApplicationContext==null
    if (this.webApplicationContext != null) {
        wac = this.webApplicationContext;
        if (wac instanceof ConfigurableWebApplicationContext) {
            ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;
            if (!cwac.isActive()) {               
                if (cwac.getParent() == null) {
                    // 將根容器作為父容器
                    cwac.setParent(rootContext);
                }
                // 啟動容器
                configureAndRefreshWebApplicationContext(cwac);
            }
        }
    }
    if (wac == null) {
        wac = findWebApplicationContext();
    }
    if (wac == null) {
        // 如果wac還是為null就創(chuàng)建容器,并將根容器設(shè)置為父容器
        wac = createWebApplicationContext(rootContext);
    }

    if (!this.refreshEventReceived) {
        // 搭建MVC,初始化Spring MVC的九大組件
        onRefresh(wac);
    }

    // 獲取 由DispatcherServlet創(chuàng)建的容器名,以kv方式放進ServletContext中
    if (this.publishContext) {     
        String attrName = getServletContextAttributeName();
        getServletContext().setAttribute(attrName, wac);
    }

    return wac;
}
protected WebApplicationContext createWebApplicationContext(@Nullable ApplicationContext parent) {
    Class contextClass = getContextClass();

    if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
        throw ...
    }
    
    ConfigurableWebApplicationContext wac =
        (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);

    wac.setEnvironment(getEnvironment());
    
    // 設(shè)置雙親容器
    wac.setParent(parent);
    String configLocation = getContextConfigLocation();
    if (configLocation != null) {
        wac.setConfigLocation(configLocation);
    }
    
    /** 配置并刷新容器
      * 在刷新容器時,會為容器創(chuàng)建一個BeanFactory對象。
      * 調(diào)用DefaultListableBeanFactory的構(gòu)造方法時會嘗試獲取父容器并將父容器本身或父容器持有的BeanFactory作為此BeanFactory的parentBeanFactory
      這個parentBeanFactory會在getBean中被用到(在獲取bean前,先嘗試從父工廠中獲取bean)
    **/
    configureAndRefreshWebApplicationContext(wac);

    return wac;
}

關(guān)于Spring MVC的上下文在Web容器中的啟動是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


名稱欄目:SpringMVC的上下文在Web容器中的啟動是怎樣的
地址分享:http://weahome.cn/article/jsdddj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部