1. 程式人生 > 其它 >Spring例項化bean過程中後置處理器的呼叫過程-順序版

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方法

呼叫的init-Method屬性指定的初始化方法

postProcessAfterInitialization

父介面BeanPostProcessor的2個方法postProcessBeforeInitialization和postProcessAfterInitializtion都是在目標物件被例項化之後,並且屬性也被設定之後呼叫的(動態代理)

DisableBean.destory

呼叫的distory-Method屬性指定的初始化方法