1. 程式人生 > >dubbo核心之ioc原始碼解析

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後端技術棧 微信公眾號