1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        spring-boot源碼分析之ConfigurableApplicationContext

        共 2625字,需瀏覽 6分鐘

         ·

        2021-09-01 22:55

        前言

        昨天我們說spring boot啟動過程中有兩塊比較核心的內(nèi)容,一個是監(jiān)聽器,一個就是spring boot容器(上下文),今天我們就先來看下springboot的容器,因為spring boot提供的容器種類比較多,所以我們今天就先來了解下容器的核心基類(接口)——ConfigurableApplicationContext。

        ConfigurableApplicationContext就是我們spring-boot最核心的內(nèi)容——應(yīng)用容器,run方法內(nèi)部也基本都是針對它進行的各種初始化操作,運行完成后返回的也是它的實例,下面我們就梳理下它的屬性和方法,對它做一個簡單的了解。


        ConfigurableApplicationContext

        ConfigurableApplicationContext是一個基礎(chǔ)接口,它是03.11.2003引入的(好早呀),內(nèi)部包括7個靜態(tài)常量,13個接口方法,同時它還繼承了ApplicationContext、LifecycleCloseable。

        ApplicationContext是所有容器的基類,spring boot提供了很多容器的實現(xiàn),這里我們目前只看默認的容器;Lifecycle是和類生命周期有關(guān)的接口,它的內(nèi)部提供了三個方法,start、stopisRunning

        靜態(tài)常量

        • CONFIG_LOCATION_DELIMITERS:配置文件路徑分隔符,主要用來分割各個配置文件路徑的
        • CONVERSION_SERVICE_BEAN_NAME:轉(zhuǎn)換服務(wù)的bean name,通過這個服務(wù),我們則可以實現(xiàn)類型轉(zhuǎn)換操作
        • LOAD_TIME_WEAVER_BEAN_NAMEspring boot加載期代碼織入器的bean name,這個組件的作用主要是為spring boot自定義類加載器提供支持的
        • ENVIRONMENT_BEAN_NAME:環(huán)境的bean name
        • SYSTEM_PROPERTIES_BEAN_NAME:系統(tǒng)配置的bean name
        • SYSTEM_ENVIRONMENT_BEAN_NAME:系統(tǒng)環(huán)境變量bean name
        • SHUTDOWN_HOOK_THREAD_NAME:關(guān)閉鉤子函數(shù)線程名稱

        接口方法

        • setId:設(shè)置應(yīng)用容器的唯一id
        • setParent:設(shè)置父級容器(上下文)
        • setEnvironment:設(shè)置當(dāng)前容器環(huán)境變量
        • getEnvironment:返回此應(yīng)用程序上下文的環(huán)境,允許進一步自定義
        • addBeanFactoryPostProcessor:添加BeanFactoryPostProcessor,BeanFactoryPostProcessor功能比較強大,它可以修改容器的內(nèi)部bean factory,改變bean的創(chuàng)建
        • addApplicationListener:添加容器監(jiān)聽器,主要是指繼承了ApplicationListener的監(jiān)聽器
        • setClassLoader:設(shè)置類加載器
        • addProtocolResolver:注冊協(xié)議解析器。協(xié)議解析器的作用就是根據(jù)指定的地址和資源加載期,解析資源并將資源返回
        • refresh:加載或者刷新配置持久化代理,它的來源可以是java基礎(chǔ)配置、 xml文件、屬性文件、數(shù)據(jù)庫或者其他文件格式。根據(jù)官方文檔描述,refresh是一個啟動方法,如果執(zhí)行失敗,它會銷毀已經(jīng)創(chuàng)建的單例,以避免懸空資源。也就是說,在調(diào)用這個方法之后,要么全部實例化,要么根本不實例化。
        • registerShutdownHook:注冊關(guān)閉鉤子函數(shù)
        • close:關(guān)閉容器
        • isActive:獲取容器是否活躍
        • getBeanFactory:獲取bean factory

        父類方法

        • getId:獲取容器id
        • getApplicationName:獲取應(yīng)用名稱
        • getDisplayName:獲取應(yīng)用展示名稱
        • getStartupDate:獲取啟動時間
        • getParent:獲取父類容器
        • getAutowireCapableBeanFactory:獲取自動裝備bean工廠,根據(jù)官方給出的解釋,這個方法主要給spring boot外部使用的,便于我們將非spring bootbean裝配進spring boot容器中。

        下面我們簡單調(diào)幾個方法看下效果:

        然后我們再調(diào)一下close方法看下:

        根據(jù)輸出的日志我們可以看出來,執(zhí)行完close方法之后,容器成功關(guān)閉,關(guān)閉之前isActivetrue,關(guān)閉之后變成了false。我們調(diào)用close方法實際上調(diào)用的是關(guān)閉的鉤子函數(shù):

        另外,在測試過程中,我發(fā)現(xiàn)bean注入容器是在refresh方法中進行的,但是目前還沒有梳理清楚。

        總結(jié)

        今天這些內(nèi)容搞完之后,我發(fā)現(xiàn)我有點懵逼了,spring boot的啟動過程還是很復(fù)雜的,特別是容器的初始化過程,雖然看起來就只是基于ConfigurableApplicationContext,但事實上涉及到的內(nèi)容特別多,比如BeanFactoryPostProcessor、ApplicationListener、ProtocolResolver等,這些組件每一個都是有著比較復(fù)雜的實現(xiàn),以前真的只考慮用了,也從來不考慮它的內(nèi)部是如何實現(xiàn)的,只有實際去看源碼的時候,才發(fā)現(xiàn)類與類、類與接口、接口與接口關(guān)系原來是如此的復(fù)雜,感覺想梳理清楚真的好難。

        不過幸運的是,經(jīng)過這幾天的摸索,閱讀晦澀的源碼,debug代碼,我發(fā)現(xiàn)一天要比一天容易一點。我現(xiàn)在就感覺自己好像在挖寶藏,只能一點一點刨,但是目前刨出來東西還不足以讓我看清spring boot的全貌,不過我相信隨著不斷的深入探索和研究,未來一切都會更清晰,當(dāng)然后面我應(yīng)該是不會再貪多了,分析源碼本來就是一個費力花時間還不出活的過程,只能一點點地啃了。

        最后,我特別想知道各位小伙伴最希望我分享哪方面的知識,可以給我私信或者留言,我現(xiàn)在基本上都是自己想到哪分享到那,所以內(nèi)容上可能不一定符合各位小伙伴的口味和節(jié)奏,如果你能說出自己的需求或者想法,那這個學(xué)習(xí)過程才意思,你說呢?

        好了,今天就先到這里吧!

        - END -


        瀏覽 89
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            竹菊av一区二区三区四区五区 | 丁香花激情 | 中国黄色网页 | 国内精品一级毛片国产99 | 中文字幕亚洲在线 | 一级淫乱 | 国产视频污 | yw.139尤物在线精品视频 | 91在线无精精品秘 白丝 | 一级毛片学生妹 |