前面已經講到了:segmentfault
本文來說下 Dubbo SPI - 擴展點自動裝配, 即 Dubbo 實現的 IOC , 用一段簡單代碼來解釋下:code
當實例化 A 時, 發現 A 依賴了 B, 而且有對應的 set 注入方法, 那麼 Dubbo 就會順便把 B 也實例化, 並注入到 A 對象中.對象
public class A { private B b; public void setB(B b) { this.b = b; } }
上面簡單的介紹了 IOC, 那麼接下來看看 Dubbo SPI - 擴展點自動裝配是如何作的.接口
引用官網的一段介紹
加載擴展點時,自動注入依賴的擴展點。get
加載擴展點時,擴展點實現類的成員若是爲其它擴展點類型,ExtensionLoader 在會自動注入依賴的擴展點。io
ExtensionLoader 經過掃描擴展點實現類的全部 setter 方法來斷定其成員。即 ExtensionLoader 會執行擴展點的拼裝操做。class
interface ServiceA { void sayA(); }
// 實現類 public class ServiceAImpl implements ServiceA { private ServiceB serviceB; public void setB(ServiceB serviceB) { this.serviceB = serviceB; } public void sayA() { System.out.println("service A") serviceB.sayB(); } } // 須要注入的類 public class ServiceB { public void sayB(){ System.out.println("service B") } }
serviceA=com.nimo.spi.ServiceAImpl
ExtensionLoader<ServiceA> extensionLoader = ExtensionLoader.getExtensionLoader(ServiceA.class); ServiceA serviceA = extensionLoader.getExtension("serviceA"); serviceA.sayA();
打印以下:擴展
service A service B
Dubbo SPI - 擴展點自動裝配(Dubbo IOC), 實現了相似 Spring IOC 的功能, 也就是在加載擴展實現類 (好比 ServiceA) 時, 若是檢測到該類依賴了其餘類 (ServiceB), Dubbo 就會把依賴類進行實例化, 而且經過 set 方法注入到該對象中(ServiceA).