Spring例項化bean過程中後置處理器的呼叫過程-順序版
bean例項化之前掃描bean呼叫到的後置處理器
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry
ConfigurationClassPostProcessor(繼承BeanDefinitionRegistryPostProcessor)的postProcessBeanDefinitionRegistry
最終執行parser.parse(candidates)====>scanner.doScan(StringUtils.toStringArray(basePackages))掃描所有的bean註冊到beanDefinitionNames和beanDefinitionMap中去
ConfigurationClassPostProcessor.postProcessBeanFactory
BeanFactoryPostProcessor介面的postProcessBeanFactory方法(第一次也是執行ConfigurationClassPostProcessor)
bean例項化過程中呼叫的後置處理器
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
在目標物件例項化之前呼叫,方法的返回值型別是Object,我們可以返回任何型別的值。由於這個時候目標物件還沒有例項化,所以這個返回值可以用來代替本該生成的目標物件的例項(一般都是代理物件)。如果該方法的返回值代替原本該生成的目標物件,後續只有postProcessAfterInitialization方法會呼叫,其他方法不再呼叫;否則按照正常的流程走。
SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors
檢測Bean的構造器,可以檢測出多個候選構造器
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition
快取bean的注入資訊的後置處理器,僅僅是快取或者乾脆叫做查詢更加合適,沒有完成注入,注入是另外一個後置處理器的作用
SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference
迴圈引用的後置處理器,這個東西比較複雜,獲得提前暴露的bean引用。主要用於解決迴圈引用的問題,只有單例物件才會呼叫此方法
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
方法在目標例項化之後呼叫,這個時候物件已經被例項化,但是例項的屬性還未被設定,都是null。如果該方法返回false,會忽略屬性值的設定;如果返回true,會按照正常的流程設定屬性值。方法不管postProcessBeforeInstantiation方法的返回值是什麼都會執行。
InstantiationAwareBeanPostProcessor.postProcessPropetyValues
方法對屬性值進行修改(這個時候屬性值還未被設定,但是我們可以修改原本該設定進去的屬性值)。如果postProcessAfterInstantiation方法返回false,該方法不會被呼叫。可以在該方法內對屬性值進行修改
BeanNameAware的setBeanName()方法
BeanFactoryAware的setBeanFactory()方法
postProcessBeforeInitialization
Initializing的afterPropertiesSet方法
呼叫
postProcessAfterInitialization
父介面BeanPostProcessor的2個方法postProcessBeforeInitialization和postProcessAfterInitializtion都是在目標物件被例項化之後,並且屬性也被設定之後呼叫的(動態代理)
DisableBean.destory
呼叫