最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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()方法就是去匹配前面提到的裝飾模式用到的方式。

而這些類作為插件會(huì)被放入cachedWrapperClasses進(jìn)行緩存。而對(duì)這個(gè)緩存的使用就是解開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)就是將被裝飾類實(shí)例作為參數(shù)調(diào)用warpper類的自身復(fù)制構(gòu)造函數(shù),這樣就會(huì)把被裝飾累包裝起來(lái),從而達(dá)到,當(dāng)有調(diào)用被裝飾類的方法是就可以執(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ì)外開放service的入口方法,它返回exporter,代碼中實(shí)際是返回了ListenerExporterWrapper,這也是個(gè)裝飾類,不過沒有使用上面提到的機(jī)制,只是把exporter和listener進(jìn)行類包裝,在構(gòu)造函數(shù)里將listener執(zhí)行。至此我們終于找到了執(zhí)行l(wèi)istener的代碼。

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

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

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

public abstract class ExporterListenerAdapter implements ExporterListener {

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

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

}

這是個(gè)技巧吧,剛剛上面提到自己要寫擴(kuò)展類的時(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仿微信搖一搖實(shí)現(xiàn)播放音樂

    java仿微信搖一搖實(shí)現(xiàn)播放音樂

    這篇文章主要為大家詳細(xì)介紹了java仿微信搖一搖實(shí)現(xiàn)播放音樂,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Java字符串相關(guān)類使用方法詳解

    Java字符串相關(guān)類使用方法詳解

    String、StringBuilder、StringBuffer還傻傻分不清,下面這篇文章主要給大家介紹了關(guān)于Java字符串相關(guān)類使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 源碼解析帶你了解LinkedHashMap

    源碼解析帶你了解LinkedHashMap

    大多數(shù)情況下,只要不涉及線程安全問題,Map基本都可以使用HashMap,不過HashMap有一個(gè)問題,就是迭代HashMap的順序并不是HashMap放置的順序,也就是無(wú)序。HashMap的這一缺點(diǎn)往往會(huì)帶來(lái)困擾,所以LinkedHashMap就閃亮登場(chǎng)了,這篇文章通過源碼解析帶你了解LinkedHashMap
    2021-09-09
  • SpringBoot解決ajax跨域問題的方法

    SpringBoot解決ajax跨域問題的方法

    這篇文章主要為大家詳細(xì)介紹了SpringBoot解決ajax跨域問題的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • SpringBoot接收與響應(yīng)xml報(bào)文請(qǐng)求的實(shí)現(xiàn)

    SpringBoot接收與響應(yīng)xml報(bào)文請(qǐng)求的實(shí)現(xiàn)

    我們?cè)谶M(jìn)行接口對(duì)接時(shí),會(huì)出現(xiàn)報(bào)文形式的信息傳遞,這篇文章主要給大家介紹了關(guān)于SpringBoot接收與響應(yīng)xml報(bào)文請(qǐng)求的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • java文件下載設(shè)置中文名稱的實(shí)例(response.addHeader)

    java文件下載設(shè)置中文名稱的實(shí)例(response.addHeader)

    下面小編就為大家分享一篇java文件下載設(shè)置中文名稱的實(shí)例(response.addHeader),具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-12-12
  • 有關(guān)Java常見的誤解小結(jié)(來(lái)看一看)

    有關(guān)Java常見的誤解小結(jié)(來(lái)看一看)

    下面小編就為大家?guī)?lái)一篇有關(guān)Java常見的誤解小結(jié)(來(lái)看一看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-05-05
  • 從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    這篇文章主要為大家介紹了從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens刷新令牌示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解

    Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解

    這篇文章主要介紹了Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解,Closeable接口繼承于AutoCloseable,主要的作用就是自動(dòng)的關(guān)閉資源,其中close()方法是關(guān)閉流并且釋放與其相關(guān)的任何方法,如果流已被關(guān)閉,那么調(diào)用此方法沒有效果,需要的朋友可以參考下
    2023-12-12
  • java selenium處理Iframe中的元素示例

    java selenium處理Iframe中的元素示例

    本文主要介紹java selenium處理Iframe中的元素,這里整理了相關(guān)資料并附有示例代碼和實(shí)現(xiàn)方法,有需要的小伙伴可以參考下
    2016-08-08

最新評(píng)論

平顺县| 天气| 铁岭市| 枝江市| 扎兰屯市| 历史| 永昌县| 治县。| 江城| 广昌县| 华池县| 连州市| 鄂尔多斯市| 平南县| 金秀| 卢氏县| 革吉县| 铁岭市| 济阳县| 盐池县| 荣成市| 左贡县| 哈巴河县| 乐山市| 香港 | 大庆市| 岑溪市| 罗江县| 丽江市| 易门县| 文山县| 册亨县| 普宁市| 尉氏县| 嘉善县| 二连浩特市| 福州市| 鄂托克旗| 峨山| 儋州市| 凤台县|