可以檢視上一章節,createBean在getSingleton方法中被呼叫。
createBean
原始碼比較簡短,流程如下:
解析bean的型別處理lookup-method和replace-method方法在bean初始化前應用後置處理,若後置處理的bean不為空,則直接返回若上一步返回為空,呼叫doCreateBean建立bean例項1 驗證和準備override方法當用戶配置了 lookup-method 和 replace-method 時,Spring 需要對目標 bean 進行增強。在增強之前,需要做一些準備工作,也就是 prepareMethodOverrides 中的邏輯。
上面的原始碼中,prepareMethodOverrides方法迴圈呼叫了prepareMethodOverride方法,prepareMethodOverride這個方法主要用於獲取指定方法的方法數量count,並根據count的值進行相應的處理。count=0時,表明方法不存在,此時丟擲異常。count=1時,設定MethodOverride物件的overloaded成員變數為false。這樣做的目的在於,提前標註名稱mo.getMethodName()的方法不存在過載,在使用CGLIB增強階段就不需要進行校驗,直接找到某個方法進行增強即可。
2 例項化前的後置處理後置處理是Spring的一個拓展點,使用者透過實現BeanPostProcessor介面,並將實現類配置到Spring的配置檔案中(或者使用註解),即可在bean初始化前後進行自定義操作。
在resolveBeforeInstantiation方法中,當前置處理方法返回的bean不為空時,後置處理才會被執行。前置處理器是InstantiationAwareBeanPostProcessor型別的,該種類型的處理器一般用在Spring框架內部,比如AOP模組中的AbstractAutoProxyCreator抽象類間接實現了這個介面中的postProcessBeforeInstantiation方法,所以AOP可以在這個方法中生成為目標類的代理物件。不過我在除錯的過程中,發現AOP在此處生成代理物件是有條件的。一般情況下條件都不成立,也就不會在此處生成代理物件。
3 doCreateBean方法建立bean來總結一下 doCreateBean 方法的執行流程吧,如下:
從快取中獲取BeanWrapper實現類物件,並清理相關記錄若未命中快取,則建立bean例項,並將例項包裹在BeanWrapper實現類物件中返回應用MergedBeanDefinitionPostProcessor後置處理器相關邏輯根據條件決定是否提前暴露bean的早期引用(early reference),用於處理迴圈依賴問題呼叫populateBean方法向bean例項中填充屬性呼叫initializeBean方法完成餘下的初始化工作註冊銷燬邏輯doCreateBean方法的流程比較複雜,步驟略多。由此也可瞭解到建立一個bean 還是很複雜的,這中間要做的事情繁多。比如填充屬性、對 BeanPostProcessor 拓展點提供支援等。