我們都知道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的情況
最後
文章只是本人在學習過程中作的壹些筆記之類的東西,如果那位看官在瀏覽過程中有那怕壹丁點的收獲,那我感到萬分榮幸。如果有發現了錯誤,也萬望不吝賜教。