聊聊spring之bean對象的實例化過程


在spring實例化 之前bean對象封裝成 beanDefinition 對象 想了解詳情的請參考上一篇文章

好了 我們聊聊 Bean 的實例化過程的幾個重要角色
BeanDefinitionRegistryPostProcessor 接口
Refresh().invokeBeanFactoryPostProcessors 這個方法里面。
BeanDefinitionRegistryPostProcessor 這個接口的調用分為三部:
1、調用實現了 PriorityOrdered 排序接口
2、調用實現了 Ordered 排序接口
3、沒有實現接口的調用
這個接口我的理解:獲取 BeanDefinitionRegistry 對象,獲取到這個對象就可以獲取這個對象中注冊的
所有 BeanDefinition 對象,所以我們知道了,我們擁有這個對象就可以完成里面所有 BeanDefinition 對
象的修改新增操作

 

BeanPostProcessor 的注冊
Refresh().registerBeanPostProcessors 這個方法里面。
拿到 BeanFactory 中所有注冊的 BeanDefinition 對象的名稱 beanName。
 
然后判斷是否實現了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是將
該 ppName 對應的 BeanDefinition 對象實例化。
把對應的 BeanPostProcessor 對象注冊到 BeanFactory 中,BeanFactory 中有一個
list 容器接收。
getSingleton 方法
代碼位置:
AbstractBeanFactory.doGetBean 方法中
 

 

 

方法里面核心要點:

 

 

把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在這個集合里
面的 bean 都是正在實例化的 bean,就是實例化還沒做完的 BeanName
調到 getObject 方法,完成 bean 的實例化。接下來

 

 

getObject 調用完后,就代表着 Bean 實例化已經完成了,這時候就需要
1、singletonsCurrentlyInCreation 把 beanName 從這個集合中刪除
2、addSingleton,把 bean 緩存到一級緩存中
createBean 方法
代碼位置:
AbstractBeanFactory.doGetBean 方法中

 

這個方法是 bean 實例化核心方法

 

 

 

實例化方法,把 bean 實例化,並且包裝成 BeanWrapper
點進這個方法里面。

 

 

這個方法是反射調用類中的 factoryMethod 方法。這要知道@Bean 方法的原理,實際上
spring 會掃描有@bean 注解的方法,然后把方法名稱設置到 BeanDefinition 的 factoryMethod
屬性中,接下來就會調到上面截圖中的方法實現@Bean 方法的調用。該方法里面的參數解
析過程不需要了解。

 

 

determineConstructorsFromBeanPostProcessors
這個方法是 BeanPostProcessor 接口類的首次應用,最終會掉到
AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會掃描有注解的構造函數然后完
成裝配過程。


免責聲明!

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



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