本篇文章给大家分享的是有关侦听器如何在达博中实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
<强>拿ProtocolListenerWrapper为例子,看源码的时候发现它是一个装饰类的标准实现有一个自身的复制构造函数,把被包装者复制进来,然后结合装饰部分的操作。强>看下ProtocolListenerWrapper类有这样的代码:
public class ProtocolListenerWrapper implements Protocol { private 才能;final  Protocol 协议; public 才能ProtocolListenerWrapper (Protocol 协议){ ,,,if (protocol ==, null), { ,,,,,throw new IllegalArgumentException (“protocol ==, null"); ,,,} ,,,this.protocol =,协议; ,,} public 才能;int  getDefaultPort (), { ,,,return protocol.getDefaultPort (); ,,} public 才能;& lt; T>, Exporter,出口(Invoker (protocol.export(调用者), ,,,,,,,Collections.unmodifiableList (ExtensionLoader.getExtensionLoader (ExporterListener.class) ,,,,,,,,,,,.getActivateExtension (invoker.getUrl (),, Constants.EXPORTER_LISTENER_KEY))); ,,} public 才能;& lt; T>, Invoker ,参考(Class (protocol.refer(类型,url), ,,,,,,,Collections.unmodifiableList ( ,,,,,,,,,,,ExtensionLoader.getExtensionLoader (InvokerListener.class) ,,,,,,,,,,,.getActivateExtension (url, Constants.INVOKER_LISTENER_KEY))); ,,} public 才能;void 破坏(),{ ,,,protocol.destroy (); ,,} }
而我们在ExtensionLoader里找到了这份代码片段clazz.getConstructor()方法就是去匹配前面提到的装饰模式用到的方式。
而这些类作为插件会被放入cachedWrapperClasses进行缓存。而对这个缓存的使用就是解开listenter调用实现的钥匙。
try { clazz.getConstructor才能(类型); Set<才能;Class< ?在祝辞,wrappers =, cachedWrapperClasses; if 才能;(wrappers ==, null), { ,,,cachedWrapperClasses =, new ConcurrentHashSet<强>上面也可以看到用一场作为一个判断逻辑。强>
ExtensionLoader中getExtension(字符串名称)方法中会调用createExtension(字符串名称)这个方法中将cachedWrapperClasses利用了起来,具体实现就是将被装饰类实例作为参数调用经类的自身复制构造函数,这样就会把被装饰累包装起来,从而达到,当有调用被装饰类的方法是就可以执行到经纱中的逻辑代码了,实现都是调用了clazz。getConstructor方法,代码片段:
Set再回去看一下ProtocolListenerWrapper,我们可以发现继承协议中的出口方法是对外开放服务的入口方法,它返回出口国,代码中实际是返回了ListenerExporterWrapper,这也是个装饰类,不过没有使用上面提到的机制,只是把出口国和侦听器进行类包装,在构造函数里将侦听器执行。至此我们终于找到了执行侦听器的代码。
在达博的开发中侦听器是及其重要的一个扩展口子,在服务对外时执行一些自己想做的事情就些各类继承ExporterListener
在引用服务的时候想做些自己的事就写个类继承InvokerListener。
另外,ExporterListener为例,发现他的子类中有一个ExporterListenerAdapter,两个空方法,代码:
public abstract class ExporterListenerAdapter implements ExporterListener { public 才能;void 出口(Exporter<?祝辞,出口国),throws RpcException { ,,} public 才能;void  unexported (Exporter<?祝辞,出口国),throws RpcException { ,,} null侦听器如何在达博中实现