1. 程式人生 > 程式設計 >Spring bean物件例項化實現過程圖解

Spring bean物件例項化實現過程圖解

好了 我們聊聊 Bean 的例項化過程的幾個重要角色

BeanDefinitionRegistryPostProcessor 介面

Refresh().invokeBeanFactoryPostProcessors 這個方法裡面。

BeanDefinitionRegistryPostProcessor 這個介面的呼叫分為三部:

1、呼叫實現了 PriorityOrdered 排序介面

2、呼叫實現了 Ordered 排序介面

3、沒有實現介面的呼叫

這個介面我的理解:獲取 BeanDefinitionRegistry 物件,獲取到這個物件就可以獲取這個物件中註冊的所有 BeanDefinition 物件,所以我們知道了,我們擁有這個物件就可以完成裡面所有 BeanDefinition 物件的修改新增操作

Spring bean物件例項化實現過程圖解

BeanPostProcessor 的註冊

Refresh().registerBeanPostProcessors 這個方法裡面。

Spring bean物件例項化實現過程圖解

拿到 BeanFactory 中所有註冊的 BeanDefinition 物件的名稱 beanName。

Spring bean物件例項化實現過程圖解

然後判斷是否實現了 PriorityOrdered 排序介面,Ordered 排序介面,getBean 是將該 ppName 對應的 BeanDefinition 物件例項化。

Spring bean物件例項化實現過程圖解

把對應的 BeanPostProcessor 物件註冊到 BeanFactory 中,BeanFactory 中有一個list 容器接收。getSingleton 方法程式碼位置:AbstractBeanFactory.doGetBean 方法中

Spring bean物件例項化實現過程圖解

方法裡面核心要點:

Spring bean物件例項化實現過程圖解

Spring bean物件例項化實現過程圖解

把 beanName 新增到 singletonsCurrentlyInCreation Set 容器中,在這個集合裡面的 bean 都是正在例項化的 bean,就是例項化還沒做完的 BeanName

Spring bean物件例項化實現過程圖解

調到 getObject 方法,完成 bean 的例項化。接下來

Spring bean物件例項化實現過程圖解

getObject 呼叫完後,就代表著 Bean 例項化已經完成了,這時候就需要

1、singletonsCurrentlyInCreation 把 beanName 從這個集合中刪除

2、addSingleton,把 bean 快取到一級快取中

Spring bean物件例項化實現過程圖解createBean

方法程式碼位置:AbstractBeanFactory.doGetBean 方法中

Spring bean物件例項化實現過程圖解

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

Spring bean物件例項化實現過程圖解

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

Spring bean物件例項化實現過程圖解

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

Spring bean物件例項化實現過程圖解

determineConstructorsFromBeanPostProcessors

這個方法是 BeanPostProcessor 介面類的首次應用,最終會掉到AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會掃描有註解的建構函式然後完成裝配過程。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。