當前位置:編程學習大全網 - 編程語言 - Spring容器初始化過程中的九次後置處理器的回調

Spring容器初始化過程中的九次後置處理器的回調

我們都知道Spring容器的初始化是壹個相當復雜的過程,在這個過程中有很多工作是依靠Spring中的後置處理器(BeanPostProcessor)完成的,那麽在這裏打找找這過程中的九次後置處理器回調的地方。

BeanPostProcessor接口及擴展

首先看壹下BeanPostProcessor及其擴展接口的關系圖

第壹次 : InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

調用鏈:

1.AbstractAutowireCapableBeanFactory.createBean

2.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation

3.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation

這個方法回調是在目標bean被實例化之前執行的,如果applyBeanPostProcessorsBeforeInstantiation返回壹個非空對象,則這個返回的對象將作為目標bean,後續的bean實例化步驟都會中斷。可以參考AOP中的AbstractAutoProxyCreator。

第二次 : SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors

調用鏈:

1.AbstractAutowireCapableBeanFactory.createBeanInstance

2.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors

determineConstructorsFromBeanPostProcessors用於推斷實例化bean的構造方法

第三次 : MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

調用鏈:

1.AbstractAutowireCapableBeanFactory.doCreateBean

2.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors

postProcessMergedBeanDefinition用於合並bean定義

第四次 : SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

調用鏈:

1.AbstractAutowireCapableBeanFactory.doCreateBean

2.AbstractAutowireCapableBeanFactory.getEarlyBeanReference

getEarlyBeanReference這個方法旨在獲取指定的bean的日期引用,通常用於解析循環依賴,這個回調讓後置處理器盡早地暴露wrapper(在目標bean實例完全初始化之前)

第五次 : InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

調用鏈:

1.AbstractAutowireCapableBeanFactory.createBean

2.AbstractAutowireCapableBeanFactory.doCreateBean

3.AbstractAutowireCapableBeanFactory.populateBean

postProcessAfterInstantiation:在bean通過構造方法或者工廠方法實例化之後,但Spring填充屬性(來自顯式屬性或自動裝配)之前執行的壹些操作,這是在Spring的自動裝配開始之前,對給定bean實例執行自定義字段註入的回調。返回布爾類型,用於判斷是不是需要屬性填充,如果返回false則直接從populateBean中返回,不再執行後續 六到八 的回調

第六次 : InstantiationAwareBeanPostProcessor#postProcessProperties / postProcessPropertyValues

調用鏈(跟第五次壹樣,在同壹個方法中調用):

1.AbstractAutowireCapableBeanFactory.createBean

2.AbstractAutowireCapableBeanFactory.doCreateBean

3.AbstractAutowireCapableBeanFactory.populateBean

兩個回調都是對給定的bean進行屬性填充,postProcessProperties默認返回的null,而postProcessPropertyValues默認返回的時PropertyValues,postProcessProperties是Spring 5.1新添加的回調方法,而postProcessPropertyValues在5.1後被標識為丟棄,不推薦使用。

第七次 : BeanPostProcessor#postProcessBeforeInitialization

調用鏈:

1.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition)

2.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization

在任何bean初始化回調(如InitializingBean的afterPropertiesSet或自定義init-method)之前回調這個方法,bean已經被填充了屬性值。返回的bean實例可能是原始bean的包裝器。

第八次 : BeanPostProcessor#postProcessAfterInitialization

調用鏈:

1.AbstractAutowireCapableBeanFactory.initializeBean(String, Object,RootBeanDefinition)

2.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization

在任何bean初始化回調(如 InitializingBean 的afterPropertiesSet或自定義init-method)之後回調這個方法,bean已經被填充了屬性值。返回的bean實例可能是原始bean的包裝器。對於FactoryBean,這個回調將被FactoryBean實例和FactoryBean創建的對象調用(從Spring 2.0開始)。後處理器可以決定是應用於FactoryBean還是創建的對象,或者通過相應的bean instanceof FactoryBean檢查應用於兩者。與所有其他的BeanPostProcessor回調不同,這個回調也將在由壹個InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation方法觸發的短路之後調用

第九次 : DestructionAwareBeanPostProcessor#postProcessBeforeDestruction

調用鏈:

1.DefaultSingletonBeanRegistry.destroyBean

2.DisposableBeanAdapter.destroy

在給定的bean被銷毀之前調用,例如調用自定義銷毀回調。與 DisposableBean 的destroy和自定義的destroy方法壹樣,此回調將僅應用於容器完全管理其生命周期的bean。這通常是單例和作用域bean的情況

最後

文章只是本人在學習過程中作的壹些筆記之類的東西,如果那位看官在瀏覽過程中有那怕壹丁點的收獲,那我感到萬分榮幸。如果有發現了錯誤,也萬望不吝賜教。

  • 上一篇:寶馬5系id7系統是什麽時候有的
  • 下一篇:如何寫出更好的Java代碼
  • copyright 2024編程學習大全網