激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 基于dubbo中Listener的實現方法

基于dubbo中Listener的實現方法

2020-12-14 13:08killbug Java教程

下面小編就為大家帶來一篇基于dubbo中Listener的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

這里繼續dubbo的源碼旅程,在過程中學習它的設計和技巧,看優秀的代碼,我想對我們日程編碼必然有幫助的。而那些開源的代碼正是千錘百煉的東西,希望和各位共勉。

拿ProtocolListenerWrapper為例子,看源碼的時候發現它是一個裝飾類的標準實現有一個自身的復制構造函數,把被包裝者復制進來,然后結合裝飾部分的操作。看下ProtocolListenerWrapper類有這樣的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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();
  }
 
}

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

而這些類作為插件會被放入cachedWrapperClasses進行緩存。而對這個緩存的使用就是解開listenter調用實現的鑰匙。

?
1
2
3
4
5
6
7
8
9
try {
  clazz.getConstructor(type);
  Set<Class<?>> wrappers = cachedWrapperClasses;
  if (wrappers == null) {
    cachedWrapperClasses = new ConcurrentHashSet<Class<?>>();
    wrappers = cachedWrapperClasses;
  }
  wrappers.add(clazz);
} catch (NoSuchMethodException e) {

上面也可以看到用一場作為一個判斷邏輯。

ExtensionLoader中getExtension(String name)方法中會調用createExtension(String name)這個方法中將cachedWrapperClasses利用了起來,具體實現就是將被裝飾類實例作為參數調用warpper類的自身復制構造函數,這樣就會把被裝飾累包裝起來,從而達到,當有調用被裝飾類的方法是就可以執行到warpper中的邏輯代碼了,實現都是調用了clazz.getConstructor方法,代碼片段:

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

再回去看一下ProtocolListenerWrapper,我們可以發現繼承Protocol中的export方法是對外開放service的入口方法,它返回exporter,代碼中實際是返回了ListenerExporterWrapper,這也是個裝飾類,不過沒有使用上面提到的機制,只是把exporter和listener進行類包裝,在構造函數里將listener執行。至此我們終于找到了執行listener的代碼。

在dubbo的開發中listener是及其重要的一個擴展口子,在服務對外時執行一些自己想做的事情就些各類繼承ExporterListener

在引用服務的時候想做些自己的事就寫個類繼承InvokerListener。

另外,ExporterListener為例,發現他的子類中有一個ExporterListenerAdapter,兩個空方法,代碼:

?
1
2
3
4
5
6
7
8
9
public abstract class ExporterListenerAdapter implements ExporterListener {
 
  public void exported(Exporter<?> exporter) throws RpcException {
  }
 
  public void unexported(Exporter<?> exporter) throws RpcException {
  }
 
}

這是個技巧吧,剛剛上面提到自己要寫擴展類的時候就不直接繼承ExporterListener了,因為直接繼承接口會強制要求實現兩個方法的,而實際編碼中dubbo的作者應該也發現這兩個方法是完全不同的業務時使用,所有我們可以只繼承ExporterListenerAdapter,如此自己的業務代碼中就不需要出現一個空方法了。

以上這篇基于dubbo中Listener的實現方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/killbug/archive/2017/08/10/7341968.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费黄色入口 | 免费永久看羞羞片网站入口 | 日韩精品一区二 | 欧美在线观看黄色 | av性色全交蜜桃成熟时 | 欧美成人高清视频 | 2级毛片| 精品久久久av | 午夜丰满少妇高清毛片1000部 | 一级做a爰性色毛片免费 | 精品国产一区二区三区成人影院 | 中文字幕在线观看日韩 | 日韩字幕在线观看 | 久久看免费视频 | 三级国产三级在线 | av成人在线观看 | 日本不卡一二三区 | 国产毛片在线看 | 欧美色性| 欧美激情性色生活片在线观看 | 美女视频在线观看黄 | 娇妻被各种姿势c到高潮小说 | 日本成人一区 | 高清做爰免费无遮网站挡 | 免费在线国产 | 午色影院| 免费观看黄色一级视频 | 精品成人免费一区二区在线播放 | xxx日本视频| 最新av在线免费观看 | 精品中文字幕在线观看 | www.精品久久 | 亚洲特黄 | 黄色网址免费进入 | av资源在线天堂 | 成人在线视频在线观看 | 成人在线视频国产 | 久色乳综合思思在线视频 | 国产一级免费在线视频 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美色大成网站www永久男同 |