當前位置:編程學習大全網 - 源碼下載 - DubboAdaptive

DubboAdaptive

這裏指的Adaptive是dubbo中的壹個註解: @Adaptive 。從這個註解的定義上我們可以看到 @Target({ElementType.TYPE, ElementType.METHOD}) ,它表明 @Adaptive 可以用在類、接口和方法上。

@Adaptive 代表dubbo的SPI的動態適應能力,如果@Adaptive註解在擴展點實現類上那個該擴展點就是壹個包裝真實擴展點實例的裝飾類;如果註解在方法上那麽擴展點的實例就是壹個動態代理類,例如Protocol$Adaptive對象。

adaptive設計的目的是為了識別固定已知類和擴展未知類。

代表人工實現,實現壹個裝飾類(設計模式中的裝飾模式),它主要作用於固定已知類,目前整個系統只有2個,AdaptiveCompiler、AdaptiveExtensionFactory。

代表自動生成和編譯壹個動態的Adpative類, 含有@Adaptive的方法中都可以根據方法參數動態獲取各自需要真實的擴展點。 它主要是用於SPI,因為spi的類是不固定、未知的擴展類,所以設計了動態 $Adaptive 類;

ExtensionLoader.getAdaptiveExtension 方法會返回動態編譯生成的 $Adaptive

例如: Protocol的spi類有injvm、dubbo、registry、filter、listener等很多未知擴展類, ExtensionLoader.getAdaptiveExtension 會動態編譯Protocol$Adaptive的類,再通過在動態累的方法中調用 ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(spi類); 來提取對象。

在dubbo中壹般會首先通過 ExtensionLoader.getAdaptiveExtension 獲取Adaptive擴展。這個方法會首先在擴展點接口的所有實現類中查找類上是否有含有 @Adaptive 註解,如果有這樣的類直接返回該類的實例,如果沒有則會查找擴展點接口的方法是否有 @Adaptive 註解並動態編譯壹個類實現該接口並擴展這些含有 @Adaptive 註解的方法。

Protocol 所有擴展實現類上都沒有 @Adaptive 註解,且擴展接口含有兩個 @Adaptive 註解的方法: exporter() refer() ,所以dubbo會生成壹個動態類 Protocol$Adaptive ,且它實現 Protocol 接口來擴展這兩個Adaptive方法。擴展點接口和最終動態生成Protocol$Adaptive類如下:

解釋壹下 export(com.alibaba.dubbo.rpc.Invoker arg0) 方法:

這樣就實現了每壹個方法都可以根據方法參數動態獲取各自需要真實的擴展點。

  • 上一篇:軟件的開發模型包括?
  • 下一篇:尤裏卡源課程
  • copyright 2024編程學習大全網