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源碼分析之BeanFactory · 柒

        共 1679字,需瀏覽 4分鐘

         ·

        2021-09-12 22:00

        前言

        今天繼續(xù)看refresh方法,今天的目標(biāo)是搞定三個(gè)方法:

        • obtainFreshBeanFactory
        • prepareBeanFactory
        • postProcessBeanFactory

        但是下午突然有事把我的計(jì)劃打亂了,剩下的內(nèi)容還沒(méi)有補(bǔ)充進(jìn)去,我又不想打斷自己的計(jì)劃,索性就先發(fā)一部分,剩余內(nèi)容后續(xù)完善后再更新。

        下面我們就先來(lái)簡(jiǎn)單看下吧!

        refresh

        obtainFreshBeanFactory

        這個(gè)方法的實(shí)際作用就是獲取beanFactory,其內(nèi)部調(diào)用流程如下:

        首先,它的內(nèi)部調(diào)用了AbstractApplicationContextrefreshBeanFactory方法,由于在我們當(dāng)前容器AnnotationConfigServletWebServerApplicationContext的所有父類(lèi)(或者父類(lèi)的父類(lèi))中,只有GenericApplicationContext重寫(xiě)了這個(gè)方法,所以實(shí)際調(diào)用的是GenericApplicationContextrefreshBeanFactory。

        refreshBeanFactory方法中其實(shí)就做了兩件事,一個(gè)是設(shè)置refreshed的值,這里用到了javaCAS機(jī)制,是線程安全的一個(gè)機(jī)制,如果實(shí)際值與預(yù)期值(expect)一致,則將值設(shè)置為更新值(update),這一塊屬于多線程線程安全領(lǐng)域的內(nèi)容;另一個(gè)操作就是設(shè)置beanFactoryserializationId,這個(gè)值默認(rèn)設(shè)置的是spring.application.name的值。

        prepareBeanFactory

        這個(gè)方法內(nèi)部實(shí)際就進(jìn)行了下面幾種操作:

        • 設(shè)置BeanFactory的參數(shù),包括beanClassLoader(類(lèi)加載器)、BeanExpressionResolver(表達(dá)式解析器)、TempClassLoader(臨時(shí)類(lèi)加載器);

        • beanFactory中添加了一些組件,包括PropertyEditorRegistrar(屬性編輯注冊(cè)器)、BeanPostProcessor(后置處理器);

        • 忽略接口依賴(lài)的操作;

        • 注冊(cè)依賴(lài)的操作;

        • 最后,往beanFactory中注冊(cè)了環(huán)境相關(guān)的bean

          postProcessBeanFactory

          關(guān)于這個(gè)方法官方注釋給出如下說(shuō)明:

          Modify the application context's internal bean factory after its standard initialization. All bean definitions will have been loaded, but no beans will have been instantiated yet. This allows for registering special BeanPostProcessors etc in certain ApplicationContext implementations.

          意思就是說(shuō),這個(gè)方法是在標(biāo)準(zhǔn)初始化之后,修改應(yīng)用容器的內(nèi)部beanFactory,這時(shí)候,所有bean定義都已加載,但尚未實(shí)例化任何bean,是允許往容器中注冊(cè)特殊的BeanPostProcessor的。所以這個(gè)方法其實(shí)就是在bean實(shí)例化前,往beanFactory中注冊(cè)BeanPostProcessorbean后置處理器)。

        總結(jié)

        今天由于一些特殊情況,我的原有計(jì)劃又被打亂了,有點(diǎn)無(wú)語(yǔ),但是事情撂給我了,我也不能撒手不管,所以今天只能先到這里。

        雖然三個(gè)方法也算分析完了,但是原本更細(xì)致的內(nèi)容還沒(méi)來(lái)得及剖析,好多內(nèi)容都沒(méi)來(lái)得及剖析,剩余的內(nèi)容,我明后兩天再抽時(shí)間完善下,屆時(shí)再重新分享。

        好了,各位小伙伴,晚安哦!

        - END -


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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        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>
            欧老太做爰 亚洲性猛交 | 精品91自产拍在线观看二区 | 操比视频软件 | 国语对白中文字幕 | 超碰人操 | 黄污视频在线免费观看 | 99国产精品99久久久久久娜娜 | 男女啪网站 | 黄色A级视频 | 国产白嫩护士被弄高潮91 |