天天看點

dubbo源碼研究之extension子產品

dubbo的擴充采用spi機制實作,spi(Service Provider Interface)是指一些提供給你繼承、擴充,完成自定義功能的類、接口或者方法。spi把控制權利交個調用方,調用方來決定使用該spi的哪個實作。

dubbo擴充機制的核心類是ExtensionLoader,該類通過靜态方法getExtensionLoader擷取一個指定接口的ExtensionLoader執行個體。

該方法要求通過spi實作的接口上必須包含@spi注解,并且一個接口的ExtensionLoader是唯一的,儲存在靜态容器EXTENSION_LOADERS(ConcurrentHashMap)中。

ExtensionLoader提供執行個體方法getExtension擷取該接口的具體實作。

具體流程如下

[img]http://dl2.iteye.com/upload/attachment/0121/5297/8f662a36-206f-30f5-b88f-583b18ed5890.jpg[/img]

該方法通過大量緩存容器來優化性能,并且每個擴充點都是單例存在,是以擴充dubbo架構的時候要注意該擴充點的線程安全性。

ExtensionFactory為spi接口實作執行個體在注入屬性(injectExtension)時提供注入的屬性.

[img]http://dl2.iteye.com/upload/attachment/0121/5295/3b4fa0c8-cd91-31c8-8a2b-d2799c371a40.png[/img]

該工廠有三個實作,分别支援從spring ,spi,Adaptive裡面擷取對象,注入Extension對象中。