spring源碼學習(四)-spring生命周期用到的后置處理器


 
        

生命周期的九大后置處理器
第一次調用后置處理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
調用的是InstantiationAwareBeanPostProcessor --> postProcessBeforeInstantiation方法
當一個bean在實例化之前,判斷這個bean要不要產生一些新的對象,InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法可以返回任何類型,如果返回的對象不為null,就調用beanPostProcessor的postProcessAfterInitialization方法;后面的初始化、屬性注入、實例化等方法都不會再調用
如果返回null,就正常的執行流程
在spring AOP當中,spring如果判斷當前類100%不需要進行增強(判斷當前bean是否是advice、pointcut、advisor、aopInfrastructureBean的子類,如果是,無需增強),會把這個bean放到一個map中,並將value置為false,那么在后面進行增強的時候,會排除這個map中的bean


第二次調用后置處理器,該后置處理器推斷使用哪個構造函數來初始化bean對象
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors

```
在推斷使用哪一個構造函數的時候,會首先判斷當前構造函數是否有@Value和@Autowired注解,如果沒有,那就校驗當前構造方法對應的bean和傳來的beanClass是否一樣,如果是同一個,就把當前構造函數賦值給defaultConstructor

在第二次調用后置處理器的時候,會返回當前可用的構造函數,由此來決定,使用哪個構造函數來創建bean
```

都三次調用后置處理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
調用的是MergedBeanDefinitionPostProcessor --> postProcessMergedBeanDefinition 第三個后置處理器,這個后置處理器,待學習之后,再補充;在該后置處理器執行時,會


第四次調用后置處理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference
SmartInstantiationAwareBeanPostProcessor --> getEarlyBeanReference 第四個后置處理器(把創建的對象 放到earlySingletonObjects,解決循環依賴的),處理循環依賴問題會用到這個后置處理器
這里通過后置處理器,暴露出一個ObjectFactory(個人理解是一個bean工廠),可以完成bean的實例化等操作

第五次調用后置處理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean--InstantiationAwareBeanPostProcessor--postProcessAfterInstantiation
調用的是InstantiationAwareBeanPostProcessor --> postProcessAfterInstantiation 第五個后置處理器(判斷是否需要填充屬性)
如果我們需要在程序中自己注入屬性,可以利用這個點,在這里返回false,那么spring就不會調用下面這個后置處理器來注入屬性

第六次調用后置處理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean--InstantiationAwareBeanPostProcessor--postProcessPropertyValues
調用的是InstantiationAwareBeanPostProcessor --> postProcessPropertyValues 第六個(處理類的屬性值)

第七次調用后置處理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
調用的是BeanPostProcessor --> postProcessBeforeInitialization bean初始化方法執行之前執行這個方法

第八次調用后置處理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
調用的是BeanPostProcessor --> postProcessAfterInitialization bean初始化之后執行的方法(處理AOP)

第九次是在銷毀bean容器的時候調用的
在調用ac.close()方法的時候,會調用該后置處理器 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessBeforeDestruction

 

以上是spring聲明周期中需要用到的幾個后置處理器,后面再持續更新補充

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM