天天看點

一次性講清楚spring中bean的生命周期之三:bean是如何執行個體化的

在前面的兩篇博文《一次性講清楚spring中bean的生命周期之一:getSingleton方法》和《一次性講清楚spring中bean的生命周期之二:FactoryBean的前世今生》中分析了spring中bean生命周期的過程中的getSingleton方法和getObjectForBeanInstance方法,今天來分析另外一個重要的方法createBean方法。分析的入口是AbstractBeanFacotry.doGetBean方法,如下圖,

一次性講清楚spring中bean的生命周期之三:bean是如何執行個體化的

這就是本次分析的入口。下面看該方法的詳細定義,AbstractAutowireCapableBeanFactory.createBean

重點部分已用紅色标出,下面具體來分析

bean生命周期前

在上面的方法定義中有這樣一段代碼,

就是說在進入bean的建立之前,開發者可以自己傳回一個目标類的代理類,如果傳回了那麼便直接傳回,不會繼續向下執行。看該方法怎麼實作的,AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation

該方法重要的就是applyBeanPostProcessorsBeforeInstantiation和applyBeanPostProcessorsAfterInitalization方法。

該方法的主要作用是如果在spring中有InstantiationAwareBeanPostProcessor類型的beanPostProcessor的化,會執行其postProcessBeforeInstantiation方法,也就是我們可以實作InstantiationAwareBeanPostProcessor接口,并實作其postProcessBeforeInstantiation方法。預設情況下該接口的方法傳回null,

回過頭來看另外一個方法,

BeanPostProcessor接口中該方法預設傳回如下

在spring容器中會有多少BeanPostProcessor這個後面會分析。

分析完了進入bean生命周期前的方法,也就是留個開發者一個後門,通過實作InstantiationAwareBeanPostProcessor接口中的postProcessBeforeInstantiation方法可以自定義傳回一個目标類型的代理對象。現在回到createBean方法中,真正進入bean的生命周期,看doCreateBean方法,

doCreateBean

該方法的篇幅過長,僅保留關鍵代碼,其他代碼删除,請知悉,

 看createBeanInstance方法

該方法的定義如下,

從上面的方法中可以看出執行個體化bean,其實就是使用類的構造方法來進行執行個體化,這裡看下instantiateBean方法的過程,

看該方法的定義,

從上面的代碼可以看到該方法中重要的就是下面這句

看下getInstantiationStrategy()方法傳回什麼,

傳回的是一個屬性,

是一個CglibSubclassingInstantiationStragegy對象,看其instantiate方法,由于CglibSubclassingInstantiationStrategy繼承了SimpleInstantiationStrategy類,該方法在父類SimpleInstantiationStrategy中

從上面可以看出有兩種方式生成執行個體,使用反射的機制

如果有lookup或replaced,使用cglib方式

标紅的代碼就是生成的邏輯,可以看到是利用的java的反射機制,也就是使用Constructor類的newInstance方法。

該方法在CglibSubclassingInstantiationStrategy中

使用的是CglibSubclassCreator生成的執行個體,具體方式就是cglib生成代理類的方式,

分析完畢spring中單例bean的執行個體化過程。

總結

至此分析完了spring中單例bean的執行個體化過程,主要有兩點,

1、類中有lookup或replaced方式,使用cglib的方式生成bean的執行個體;

2、類中無lookup或replaced方式,使用java反射機制Constructor生成執行個體;

一次性講清楚spring中bean的生命周期之三:bean是如何執行個體化的

一個愛寫文章的程式員,歡迎關注我的公衆号“北漂程式員”。我有故事,你有酒嗎