亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于dubbo中Listener的實(shí)現(xiàn)方法

 更新時(shí)間:2017年08月11日 07:58:25   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇基于dubbo中Listener的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

這里繼續(xù)dubbo的源碼旅程,在過(guò)程中學(xué)習(xí)它的設(shè)計(jì)和技巧,看優(yōu)秀的代碼,我想對(duì)我們?nèi)粘叹幋a必然有幫助的。而那些開(kāi)源的代碼正是千錘百煉的東西,希望和各位共勉。

拿ProtocolListenerWrapper為例子,看源碼的時(shí)候發(fā)現(xiàn)它是一個(gè)裝飾類(lèi)的標(biāo)準(zhǔn)實(shí)現(xiàn)有一個(gè)自身的復(fù)制構(gòu)造函數(shù),把被包裝者復(fù)制進(jìn)來(lái),然后結(jié)合裝飾部分的操作。看下ProtocolListenerWrapper類(lèi)有這樣的代碼:

public class ProtocolListenerWrapper implements Protocol {

  private final Protocol protocol;

  public ProtocolListenerWrapper(Protocol protocol){
    if (protocol == null) {
      throw new IllegalArgumentException("protocol == null");
    }
    this.protocol = protocol;
  }

  public int getDefaultPort() {
    return protocol.getDefaultPort();
  }

  public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
    if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
      return protocol.export(invoker);
    }
    return new ListenerExporterWrapper<T>(protocol.export(invoker),
        Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(ExporterListener.class)
            .getActivateExtension(invoker.getUrl(), Constants.EXPORTER_LISTENER_KEY)));
  }

  public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
    if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
      return protocol.refer(type, url);
    }
    return new ListenerInvokerWrapper<T>(protocol.refer(type, url),
        Collections.unmodifiableList(
            ExtensionLoader.getExtensionLoader(InvokerListener.class)
            .getActivateExtension(url, Constants.INVOKER_LISTENER_KEY)));
  }

  public void destroy() {
    protocol.destroy();
  }

}

而我們?cè)贓xtensionLoader里找到了這份代碼片段clazz.getConstructor()方法就是去匹配前面提到的裝飾模式用到的方式。

而這些類(lèi)作為插件會(huì)被放入cachedWrapperClasses進(jìn)行緩存。而對(duì)這個(gè)緩存的使用就是解開(kāi)listenter調(diào)用實(shí)現(xiàn)的鑰匙。

try {
  clazz.getConstructor(type);
  Set<Class<?>> wrappers = cachedWrapperClasses;
  if (wrappers == null) {
    cachedWrapperClasses = new ConcurrentHashSet<Class<?>>();
    wrappers = cachedWrapperClasses;
  }
  wrappers.add(clazz);
} catch (NoSuchMethodException e) {

上面也可以看到用一場(chǎng)作為一個(gè)判斷邏輯。

ExtensionLoader中g(shù)etExtension(String name)方法中會(huì)調(diào)用createExtension(String name)這個(gè)方法中將cachedWrapperClasses利用了起來(lái),具體實(shí)現(xiàn)就是將被裝飾類(lèi)實(shí)例作為參數(shù)調(diào)用warpper類(lèi)的自身復(fù)制構(gòu)造函數(shù),這樣就會(huì)把被裝飾累包裝起來(lái),從而達(dá)到,當(dāng)有調(diào)用被裝飾類(lèi)的方法是就可以執(zhí)行到warpper中的邏輯代碼了,實(shí)現(xiàn)都是調(diào)用了clazz.getConstructor方法,代碼片段:

Set<Class<?>> wrapperClasses = cachedWrapperClasses;
if (wrapperClasses != null && wrapperClasses.size() > 0) {
  for (Class<?> wrapperClass : wrapperClasses) {
    instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
  }
}

再回去看一下ProtocolListenerWrapper,我們可以發(fā)現(xiàn)繼承Protocol中的export方法是對(duì)外開(kāi)放service的入口方法,它返回exporter,代碼中實(shí)際是返回了ListenerExporterWrapper,這也是個(gè)裝飾類(lèi),不過(guò)沒(méi)有使用上面提到的機(jī)制,只是把exporter和listener進(jìn)行類(lèi)包裝,在構(gòu)造函數(shù)里將listener執(zhí)行。至此我們終于找到了執(zhí)行l(wèi)istener的代碼。

在dubbo的開(kāi)發(fā)中l(wèi)istener是及其重要的一個(gè)擴(kuò)展口子,在服務(wù)對(duì)外時(shí)執(zhí)行一些自己想做的事情就些各類(lèi)繼承ExporterListener

在引用服務(wù)的時(shí)候想做些自己的事就寫(xiě)個(gè)類(lèi)繼承InvokerListener。

另外,ExporterListener為例,發(fā)現(xiàn)他的子類(lèi)中有一個(gè)ExporterListenerAdapter,兩個(gè)空方法,代碼:

public abstract class ExporterListenerAdapter implements ExporterListener {

  public void exported(Exporter<?> exporter) throws RpcException {
  }

  public void unexported(Exporter<?> exporter) throws RpcException {
  }

}

這是個(gè)技巧吧,剛剛上面提到自己要寫(xiě)擴(kuò)展類(lèi)的時(shí)候就不直接繼承ExporterListener了,因?yàn)橹苯永^承接口會(huì)強(qiáng)制要求實(shí)現(xiàn)兩個(gè)方法的,而實(shí)際編碼中dubbo的作者應(yīng)該也發(fā)現(xiàn)這兩個(gè)方法是完全不同的業(yè)務(wù)時(shí)使用,所有我們可以只繼承ExporterListenerAdapter,如此自己的業(yè)務(wù)代碼中就不需要出現(xiàn)一個(gè)空方法了。

以上這篇基于dubbo中Listener的實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JAVA讀取PDF、WORD文檔實(shí)例代碼

    JAVA讀取PDF、WORD文檔實(shí)例代碼

    本篇文章主要通過(guò)實(shí)例代碼介紹了JAVA讀取PDF、WORD文檔,需要的朋友可以參考下
    2017-04-04
  • Spring boot實(shí)現(xiàn)熱部署的兩種方式詳解

    Spring boot實(shí)現(xiàn)熱部署的兩種方式詳解

    這篇文章主要介紹了Spring boot實(shí)現(xiàn)熱部署的兩種方式,這兩種方法分別是使用 Spring Loaded和使用spring-boot-devtools進(jìn)行熱部署,文中給出了詳細(xì)示例代碼和介紹,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-04-04
  • java多線程返回值使用示例(callable與futuretask)

    java多線程返回值使用示例(callable與futuretask)

    這篇文章主要介紹了多線程返回值使用示例(callable與futuretask),需要的朋友可以參考下
    2014-04-04
  • SpringBoot項(xiàng)目后端開(kāi)發(fā)邏輯全面梳理

    SpringBoot項(xiàng)目后端開(kāi)發(fā)邏輯全面梳理

    這篇文章主要介紹了SpringBoot項(xiàng)目后端開(kāi)發(fā)邏輯全面梳理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java基礎(chǔ):徹底搞懂java多線程

    Java基礎(chǔ):徹底搞懂java多線程

    篇文章主要介紹了Java多線程的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java線程相關(guān)知識(shí),感興趣的朋友可以了解下,希望能給你帶來(lái)幫助
    2021-08-08
  • Java元組類(lèi)型javatuples使用實(shí)例

    Java元組類(lèi)型javatuples使用實(shí)例

    這篇文章主要介紹了Java元組類(lèi)型javatuples使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解static 和 final 和 static final區(qū)別

    詳解static 和 final 和 static final區(qū)別

    這篇文章主要介紹了static 和 final 和 static final區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟

    java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟

    這篇文章主要介紹了java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 詳解Java多線程與并發(fā)

    詳解Java多線程與并發(fā)

    多線程是一個(gè)進(jìn)程在執(zhí)行過(guò)程中產(chǎn)生多個(gè)更小的程序單元,這些更小的單元稱(chēng)為線程,這些線程可以同時(shí)存在,同時(shí)運(yùn)行,一個(gè)進(jìn)程可能包含多個(gè)同時(shí)執(zhí)行的線程。多線程是實(shí)現(xiàn)并發(fā)機(jī)制的一種有效手段。進(jìn)程和線程一樣,都是實(shí)現(xiàn)并發(fā)的一個(gè)基本單位。
    2021-06-06
  • Springboot集成knife4j實(shí)現(xiàn)風(fēng)格化API文檔

    Springboot集成knife4j實(shí)現(xiàn)風(fēng)格化API文檔

    這篇文章主要介紹了Springboot如何集成knife4j實(shí)現(xiàn)風(fēng)格化API文檔,幫助大家更好的使用springboot框架,感興趣的朋友可以了解下
    2020-12-12

最新評(píng)論