<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源碼分析之beanFactory · 肆

          共 2042字,需瀏覽 5分鐘

           ·

          2021-09-12 22:02

          前言

          昨天我們又分析了容器的創(chuàng)建過(guò)程,從容器的創(chuàng)建過(guò)程中,我們找到了beanFactory實(shí)例化后最基本的初始化——注冊(cè)需要忽略的接口(ignoreDependencyInterface)、注冊(cè)配置處理器(registerAnnotationConfigProcessors),beanFactory剩余的初始化操作都在后面的方法中,今天我們先來(lái)看prepareContext,雖然在prepareContext前面還有一個(gè)getSpringFactoriesInstances方法,但是這個(gè)方法并沒(méi)有和beanFactory進(jìn)行交互,所以就直接跳過(guò)了。

          prepareContext

          關(guān)于這個(gè)方法,我們前面已經(jīng)分析過(guò)了,但基本上都是一帶而過(guò),所以今天我們就沿著beanFactory的初始化過(guò)程再來(lái)看下這個(gè)核心方法:

          我們先來(lái)梳理下這個(gè)方法的執(zhí)行流程:

          • 設(shè)置容器環(huán)境(context.setEnvironment),這一步操作基本與beanFacotry沒(méi)有關(guān)系,有的也是一些取值操作,并沒(méi)有往beanFactory中注冊(cè)數(shù)據(jù):

          • 容器后置處理(postProcessApplicationContext),這個(gè)方法內(nèi)部主要有三步操作。第一步是往beanFactory中注冊(cè)beanName生成器,但由于默認(rèn)情況下這個(gè)配置為空,所以并未進(jìn)行注冊(cè)操作;第二步是設(shè)置容器的資源加載器,由于resourceLoader是空,所以這里也沒(méi)有設(shè)置;最后一步是注冊(cè)轉(zhuǎn)換服務(wù),默認(rèn)情況下會(huì)為我們注冊(cè)136個(gè)轉(zhuǎn)換器,這些轉(zhuǎn)換器的作用就是進(jìn)行類(lèi)型轉(zhuǎn)換,如果能在實(shí)際開(kāi)發(fā)中用起來(lái),那也是美滋滋了:

            可以看到默認(rèn)情況下為我們注冊(cè)的轉(zhuǎn)換器包括了String轉(zhuǎn)Date這種常用的轉(zhuǎn)換,當(dāng)然我們也可以定義自己的轉(zhuǎn)換器,這個(gè)我記下來(lái),后面專(zhuān)門(mén)出一期demo示例。

          • 初始化操作(applyInitializers),這個(gè)方法我們昨天已經(jīng)分析過(guò)了,這里就不再贅述了,后面關(guān)于ApplicationContextInitializer的初始化我也會(huì)專(zhuān)門(mén)做一期demo分享的。

          • 綁定容器初始化事件(contextPrepared),這個(gè)方法在容器創(chuàng)建并準(zhǔn)備好之后,資源加載完成前執(zhí)行,這一步和beanFactory也沒(méi)有關(guān)系

          • 打印startupInfo。下面那一段代碼就是打印啟動(dòng)日志信息, 默認(rèn)情況下logStartupInfotrue,所以控制臺(tái)會(huì)輸出兩行日志:

          • 獲取beanFactorycontext.getBeanFactory()),這個(gè)是為了方便后面注冊(cè)數(shù)據(jù),因?yàn)榫o接著就需要把springApplicationArguments、springBootBanner等注冊(cè)到beanFactory中:

            最終registerSingleton方法會(huì)把他們注冊(cè)到singletonObjects容器中,從名字我們就可以看出來(lái),這是個(gè)存放單例對(duì)象的容器。

          • 設(shè)置是否允許同名覆蓋(setAllowBeanDefinitionOverriding),默認(rèn)情況下為trueallowBeanDefinitionOverriding屬性默認(rèn)值)。如果為true,后面的BeanDefinition數(shù)據(jù)會(huì)將前面的覆蓋掉。但是默認(rèn)啟動(dòng)時(shí),spring boot會(huì)將它改為false

          • 添加beanFactory懶加載后置處理器(addBeanFactoryPostProcessor),由于默認(rèn)情況下并未啟動(dòng)懶加載,所以默認(rèn)情況下懶加載后置處理器也不會(huì)被添加

          • 獲取所有資源(getAllSources),默認(rèn)情況下只包括當(dāng)前spring boot項(xiàng)目的主類(lèi),同時(shí)關(guān)聯(lián)了包括classLoader、packages等數(shù)據(jù)

          • 將資源加載到容器中(load,官方文檔給的解釋是bean)。這個(gè)方雖然看起來(lái)其貌不揚(yáng),但是內(nèi)部操作還是蠻多的。本來(lái)內(nèi)容已經(jīng)寫(xiě)出來(lái)了,但是介于篇幅我決定把剩余內(nèi)容放到明天分享,當(dāng)然也是因?yàn)?code style="overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">load方法確實(shí)也比較重要,其內(nèi)部不僅包括了scanner的初始化,而且包括了filter的相關(guān)內(nèi)容,這些都算是spring boot的核心內(nèi)容,所以還是要盡可能詳細(xì)些。

          總結(jié)

          原本是打算把prepareContext的內(nèi)容一次性分享完的,但是實(shí)際分享的時(shí)候,發(fā)現(xiàn)內(nèi)容還是蠻多的,特別是load方法,一個(gè)看起來(lái)小小的方法,沒(méi)想到它的內(nèi)部初始化操作還挺復(fù)雜的。不過(guò),經(jīng)過(guò)今天的梳理之后,我感覺(jué)對(duì)prepareContext認(rèn)識(shí)要比之前清晰多了,而且在分析的過(guò)程中,還發(fā)現(xiàn)了兩個(gè)需要demo實(shí)踐的內(nèi)容,相關(guān)內(nèi)容的flag已經(jīng)立起來(lái)了,后面就該填坑了,這也算是意外的收獲吧。

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

          - END -


          瀏覽 51
          點(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>
                  久久久视频在线观看 | 综合网一区二区三区 | 中文字幕啪啪啪 | 美女高潮喷水视频 | 国产日韩欧美在线观看 |