Spring 常用擴(kuò)展點(diǎn)記錄

這里會(huì)簡(jiǎn)單的對(duì)調(diào)用時(shí)機(jī)進(jìn)行一個(gè)排序。從小到大,值越小,調(diào)用時(shí)機(jī)越靠前。

一、BeanFactoryPostProcessor (order: 21 )

BeanFactoryPostProcessor.png

基本定義

從上圖可以看到其基本定義,實(shí)現(xiàn)類(lèi)的方法為:postProcessBeanFactory,參數(shù)為 BeanFactory。

方法調(diào)用時(shí)機(jī)

暫未看到 直接實(shí)現(xiàn) BeanFactoryPostProcessor 在哪里調(diào)用。回頭找完補(bǔ)充一下。

初始化階段,調(diào)用1次。

1.1 BeanDefinitionRegistryPostProcessor (order: 20)

BeanDefinitionRegistryPostProcessor .png

基本定義

BeanFactoryPostProcessor 的子類(lèi),在父類(lèi)基礎(chǔ)上又?jǐn)U展了一個(gè) postProcessBeanDefinitionRegistry 方法,方法參數(shù)為 BeanDefinitionRegistry。

實(shí)際上BeanFactory、與BeanDefinitionRegistry存在很緊密的聯(lián)系。以我們最常見(jiàn)的DefaultListableBeanFactory類(lèi)為例,該類(lèi)實(shí)現(xiàn)了BeanDefinitionRegistry、ConfigurableListableBeanFactory接口、繼承了AbstractBeanFactory。關(guān)系比較復(fù)雜這里不做描述,只需要知道這兩個(gè)參數(shù),雖然類(lèi)型不同,但是在很多情況下都是一個(gè)實(shí)例就OK。

調(diào)用時(shí)機(jī)

AbstractApplicationContext -> refresh() -> invokeBeanFactoryPostProcessors()
具體位置:PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

初始化階段,調(diào)用一次。

與其父類(lèi) BeanFactoryPostProcessor 方法先后順序由具體的實(shí)現(xiàn)類(lèi)決定,比如在ConfigurationClassPostProcessor(注解方式啟動(dòng) 完成 Spring IOC 工作 )實(shí)現(xiàn)類(lèi)中,調(diào)用優(yōu)先級(jí)就高于父類(lèi)方法,因此這里優(yōu)先級(jí)暫定比父類(lèi)高一些。

二、BeanPostProcessor (order:35)

BeanPostProcessor.png

基本定義

Spring Bean 實(shí)例化的處理器,包含兩個(gè)方法,實(shí)例化之前,實(shí)例化之后??梢岳斫鉃槭且环N代理模式,針對(duì)bean的實(shí)例化過(guò)程做一些擴(kuò)展,比如實(shí)例化前,做一些策略邏輯,實(shí)例化所需要的類(lèi),或者創(chuàng)建代理對(duì)象。實(shí)例化后,可以設(shè)置一些屬性值。

調(diào)用時(shí)機(jī)

這里先做一個(gè)說(shuō)明,此處調(diào)用時(shí)機(jī),僅針對(duì)直接實(shí)現(xiàn) BeanPostProcessor 類(lèi)型的,如果是其子類(lèi) 比如 InstantiationAwareBeanPostProcessor 實(shí)現(xiàn)類(lèi),調(diào)用時(shí)機(jī)由子類(lèi)決定。

doGetBean -> doCreateBean -> populateBean -> initializeBean
具體位置:AbstractAutowireCapableBeanFactory#initializeBean

針對(duì) 所有的 bean實(shí)例化,只要能走到 initializeBean 方法,均會(huì)調(diào)用。多個(gè)實(shí)現(xiàn)類(lèi)之間的順序已添加順序?yàn)橹魇褂肁rrayList存儲(chǔ)。

2.1 InstantiationAwareBeanPostProcessor (order: 34)

InstantiationAwareBeanPostProcessor 是 BeanPostProcessor 的一個(gè)子類(lèi),這個(gè)類(lèi)似乎并沒(méi)有什么用。有理解的歡迎補(bǔ)充。這里僅僅是做一個(gè)調(diào)用關(guān)系的說(shuō)明。

不同的子類(lèi)由不同的調(diào)用時(shí)機(jī),我們?cè)贁U(kuò)展的時(shí)候需要注意實(shí)現(xiàn)合適的接口。

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
}

調(diào)用時(shí)機(jī)

doGetBean -> createBean -> resolveBeforeInstantiation
在doCreateBean 之前。
具體位置:AbstractAutowireCapableBeanFactory#createBean -> resolveBeforeInstantiation()

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
       implements AutowireCapableBeanFactory {

   @Nullable
   protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
       Object bean = null;
       if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
           // Make sure bean class is actually resolved at this point.
           if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
               Class<?> targetType = determineTargetType(beanName, mbd);
               if (targetType != null) {
                   bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                   if (bean != null) {
                       bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                   }
               }
           }
           mbd.beforeInstantiationResolved = (bean != null);
       }
       return bean;
   }
}

這里僅針對(duì) InstantiationAwareBeanPostProcessor 的實(shí)現(xiàn)類(lèi),觸發(fā)的方法為 其父類(lèi) BeanPostProcessor 聲明的方法,并沒(méi)有調(diào)用自己的方法。

同樣也是 所有的 bean 都會(huì)觸發(fā),只要滿(mǎn)足觸發(fā)的條件 hasInstantiationAwareBeanPostProcessors 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容