<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          spring-boot源碼分析之ConfigurableApplicationContext

          共 2625字,需瀏覽 6分鐘

           ·

          2021-09-01 22:55

          前言

          昨天我們說(shuō)spring boot啟動(dòng)過(guò)程中有兩塊比較核心的內(nèi)容,一個(gè)是監(jiān)聽(tīng)器,一個(gè)就是spring boot容器(上下文),今天我們就先來(lái)看下springboot的容器,因?yàn)?code style="box-sizing: border-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(255, 100, 65);background-color: rgba(27, 31, 35, 0.05);word-break: break-all;">spring boot提供的容器種類比較多,所以我們今天就先來(lái)了解下容器的核心基類(接口)——ConfigurableApplicationContext

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


          ConfigurableApplicationContext

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

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

          靜態(tài)常量

          • CONFIG_LOCATION_DELIMITERS:配置文件路徑分隔符,主要用來(lái)分割各個(gè)配置文件路徑的
          • CONVERSION_SERVICE_BEAN_NAME:轉(zhuǎn)換服務(wù)的bean name,通過(guò)這個(gè)服務(wù),我們則可以實(shí)現(xiàn)類型轉(zhuǎn)換操作
          • LOAD_TIME_WEAVER_BEAN_NAMEspring boot加載期代碼織入器的bean name,這個(gè)組件的作用主要是為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è)置父級(jí)容器(上下文)
          • setEnvironment:設(shè)置當(dāng)前容器環(huán)境變量
          • getEnvironment:返回此應(yīng)用程序上下文的環(huán)境,允許進(jìn)一步自定義
          • addBeanFactoryPostProcessor:添加BeanFactoryPostProcessorBeanFactoryPostProcessor功能比較強(qiáng)大,它可以修改容器的內(nèi)部bean factory,改變bean的創(chuàng)建
          • addApplicationListener:添加容器監(jiān)聽(tīng)器,主要是指繼承了ApplicationListener的監(jiān)聽(tīng)器
          • setClassLoader:設(shè)置類加載器
          • addProtocolResolver:注冊(cè)協(xié)議解析器。協(xié)議解析器的作用就是根據(jù)指定的地址和資源加載期,解析資源并將資源返回
          • refresh:加載或者刷新配置持久化代理,它的來(lái)源可以是java基礎(chǔ)配置、 xml文件、屬性文件、數(shù)據(jù)庫(kù)或者其他文件格式。根據(jù)官方文檔描述,refresh是一個(gè)啟動(dòng)方法,如果執(zhí)行失敗,它會(huì)銷毀已經(jīng)創(chuàng)建的單例,以避免懸空資源。也就是說(shuō),在調(diào)用這個(gè)方法之后,要么全部實(shí)例化,要么根本不實(shí)例化。
          • registerShutdownHook:注冊(cè)關(guān)閉鉤子函數(shù)
          • close:關(guān)閉容器
          • isActive:獲取容器是否活躍
          • getBeanFactory:獲取bean factory

          父類方法

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

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

          然后我們?cè)僬{(diào)一下close方法看下:

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

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

          總結(jié)

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

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

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

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

          - END -


          瀏覽 89
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱情岛成人网站 | 免费看A片18 的视频 | 操逼wwww | 久草视频免费播放 | 成人AV影音 |