dubbo核心之ioc原始碼解析
核心程式碼
此方法被調用於
//為建立好的AdaptiveExtensionClass例項進行屬性注入
injectExtension((T) getAdaptiveExtensionClass().newInstance())
//為建立好的Extension例項進行屬性注入
--injectExtension(instance)
//為建立好的wrapperClass例項進行屬性注入
--wrapperClass.getConstructor(type).newInstance(instance))
整個方法的作用就是通過instance物件例項的setter方法為instance的屬性賦值,完成setter注入,即IOC的最經典的注入方式。
詳細步驟:
-
獲取instance的setter方法,通過setter方法獲取屬性名稱property和屬性型別pt(即paramType的簡寫)
-
使用objectFactory建立一個property名稱(型別為pt)的物件例項
-
執行instance的setter方法,注入property例項
其中,比較重要的就是:
Object object = objectFactory.getExtension(pt, property);
這個方法。其中的objectFactory=AdaptiveExtensionFactory例項,其屬性
factories = [SpringExtensionFactory例項, SpiExtensionFactory例項]。
getExtension()方法原始碼
先呼叫SpiExtensionFactory來例項化;
如果不行,再使用SpringExtensionFactory來例項化
首先是type必須是介面和必須有註解@SPI,獲取type的所有ExtensionClasses實現的key,獲取type的裝飾類,如果有@Adaptive註解的類,則返回該類的例項,否則返回一個動態代理類的例項(例如Protocol$Adpative的例項)
從這裡我們可以看出dubbo-SPI的另外一個好處:可以為SPI實現類注入SPI的裝飾類或動態代理類。
看一下SpringExtensionFactory的原始碼:
-
檢查該context是否包含name的bean,
-
獲取name的bean,如果是懶載入或多例的bean,此時會例項化name的bean
-
如果obj的型別是type或其子類,與instanceof相同
其中的ApplicationContext就是spring中的
再來看看ApplicationContext
關於ApplicationContextAware應用理解
參照:https://www.cnblogs.com/rekent/p/7229987.html
檢查ServiceBean的ProviderConfig provider,如果為空,從applicationContext獲取ProviderConfig型別的bean(這裡查詢的過程其實就是看有沒有配置<dubbo:provider>),如果獲取到了,進行設定
到此,dubbo --IOC原始碼就閱讀完畢。
更多dubbo原始碼解讀,請關注 Java後端技術棧 微信公眾號