spring-boot源碼分析之BeanFactory · 柒

前言
今天繼續(xù)看refresh方法,今天的目標(biāo)是搞定三個(gè)方法:
obtainFreshBeanFactoryprepareBeanFactorypostProcessBeanFactory
但是下午突然有事把我的計(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)用了AbstractApplicationContext的refreshBeanFactory方法,由于在我們當(dāng)前容器AnnotationConfigServletWebServerApplicationContext的所有父類(lèi)(或者父類(lèi)的父類(lèi))中,只有GenericApplicationContext重寫(xiě)了這個(gè)方法,所以實(shí)際調(diào)用的是GenericApplicationContext的refreshBeanFactory。
refreshBeanFactory方法中其實(shí)就做了兩件事,一個(gè)是設(shè)置refreshed的值,這里用到了java的CAS機(jī)制,是線程安全的一個(gè)機(jī)制,如果實(shí)際值與預(yù)期值(expect)一致,則將值設(shè)置為更新值(update),這一塊屬于多線程線程安全領(lǐng)域的內(nèi)容;另一個(gè)操作就是設(shè)置beanFactory的serializationId,這個(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è)BeanPostProcessor(bean后置處理器)。
總結(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 -