国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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一区二区三区 | 亚洲欧美视频在线 | 国产精品爱久久久久久久 | 中文字幕在线视频观看 | 99中文字幕 | 九九在线视频 | 国产一级片 | 国产一区二区高清在线 | av免费资源 | 国产精品国产a | 黄色一级片久久 | 国产一区二区三区在线 | 日韩a电影 | 黄色a区| 激情欧美日韩一区二区 | 91黄视频| 欧美日韩国产在线 | 精品国产乱码久久久久夜 | 欧州一级片| 日韩精品一区二区三区在线观看 | 亚洲精品久久久久久下一站 | av中文在线播放 | 亚洲免费在线观看 | 欧美黄色性视频 | 伊人网综合 | 欧美啪啪一区二区 | 日韩欧美大片在线观看 | 天堂久久爱资源站www | 99成人在线 | 欧美日韩久久久久 | 亚洲精品午夜 | 欧美一区二区三区在线视频观看 | 国产欧美视频一区二区三区 | 欧美三级网址 | 九色91 | 依人成人网 | 欧美黄色精品 | 亚洲欧美中文字幕 | 午夜免费视频 | 亚洲综合二区 | 日本一区二区不卡 |