摘要:擴(kuò)展點的對的擴(kuò)展點做一些切面功能的擴(kuò)展從的代碼說起關(guān)鍵說明,是在里面加載的,是符合某種特征的擴(kuò)展接口實現(xiàn)類的稱呼。
dubbo擴(kuò)展點的AOP
對dubbo的擴(kuò)展點做一些切面功能的擴(kuò)展
從ExtensionLoader的createExtension代碼說起@SuppressWarnings("unchecked") private T createExtension(String name) { Class> clazz = getExtensionClasses().get(name); if (clazz == null) { throw findException(name); } try { T instance = (T) EXTENSION_INSTANCES.get(clazz); if (instance == null) { EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance()); instance = (T) EXTENSION_INSTANCES.get(clazz); } injectExtension(instance); Set> wrapperClasses = cachedWrapperClasses; //begin if (wrapperClasses != null && wrapperClasses.size() > 0) { for (Class> wrapperClass : wrapperClasses) { instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance)); } } //end return instance; } catch (Throwable t) { throw new IllegalStateException("Extension instance(name: " + name + ", class: " + type + ") could not be instantiated: " + t.getMessage(), t); } }
關(guān)鍵說明,
cachedWrapperClasses是在loadFile里面加載的,"WrapperClass"是符合某種特征的擴(kuò)展接口實現(xiàn)類的稱呼。例如ProtocolFilterWrapper
和ProtocolListenerWrapper。他們共同特征就是帶有Protocol接口的構(gòu)造函數(shù)。
/** * ListenerProtocol * * @author william.liangf */ public class ProtocolFilterWrapper implements Protocol { private final Protocol protocol; public ProtocolFilterWrapper(Protocol protocol) { if (protocol == null) { throw new IllegalArgumentException("protocol == null"); } this.protocol = protocol; } private staticInvoker buildInvokerChain(final Invoker invoker, String key, String group) { Invoker last = invoker; List filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group); if (filters.size() > 0) { for (int i = filters.size() - 1; i >= 0; i--) { final Filter filter = filters.get(i); final Invoker next = last; last = new Invoker () { public Class getInterface() { return invoker.getInterface(); } public URL getUrl() { return invoker.getUrl(); } public boolean isAvailable() { return invoker.isAvailable(); } public Result invoke(Invocation invocation) throws RpcException { return filter.invoke(next, invocation); } public void destroy() { invoker.destroy(); } @Override public String toString() { return invoker.toString(); } }; } } return last; } public int getDefaultPort() { return protocol.getDefaultPort(); } public Exporter export(Invoker invoker) throws RpcException { if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) { return protocol.export(invoker); } return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER)); } public Invoker refer(Class type, URL url) throws RpcException { if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) { return protocol.refer(type, url); } return buildInvokerChain(protocol.refer(type, url), Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER); } public void destroy() { protocol.destroy(); } }
instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance)); 就是將拿到的instance放到一個包裝類中,然后經(jīng)過一層包裝之后,在放到另外一個包裝類中,
通過這種方式dubbo實現(xiàn)了擴(kuò)展點的AOP
遇到的設(shè)計模式裝飾器模式
動態(tài)代理模式
多次使用裝飾類,實現(xiàn)了dubbo擴(kuò)展點的AOP功能
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/69179.html
摘要:今天我想聊聊的另一個很棒的特性就是它的可擴(kuò)展性。的擴(kuò)展機(jī)制在的官網(wǎng)上,描述自己是一個高性能的框架。接下來的章節(jié)中我們會慢慢揭開擴(kuò)展機(jī)制的神秘面紗。擴(kuò)展擴(kuò)展點的實現(xiàn)類。的定義在配置文件中可以看到文件中定義了個的擴(kuò)展實現(xiàn)。 摘要: 在Dubbo的官網(wǎng)上,Dubbo描述自己是一個高性能的RPC框架。今天我想聊聊Dubbo的另一個很棒的特性, 就是它的可擴(kuò)展性。 Dubbo的擴(kuò)展機(jī)制 在Dub...
摘要:什么是類那什么樣類的才是擴(kuò)展機(jī)制中的類呢類是一個有復(fù)制構(gòu)造函數(shù)的類,也是典型的裝飾者模式。代碼如下有一個參數(shù)是的復(fù)制構(gòu)造函數(shù)有一個構(gòu)造函數(shù),參數(shù)是擴(kuò)展點,所以它是一個擴(kuò)展機(jī)制中的類。 摘要:?在Dubbo可擴(kuò)展機(jī)制實戰(zhàn)中,我們了解了Dubbo擴(kuò)展機(jī)制的一些概念,初探了Dubbo中LoadBalance的實現(xiàn),并自己實現(xiàn)了一個LoadBalance。是不是覺得Dubbo的擴(kuò)展機(jī)制很不錯呀...
摘要:在中配置,以配置為例整個,最先使用的地方從里面讀取這個配置使用接口的中獲取具體的實現(xiàn)類中有兩個值當(dāng)主線程被外部終止時,會觸發(fā),執(zhí)行的與方法通知下面的鎖操作,主線程正常走完代碼,并最終停止。 spring是如何啟動容器的 常見的一種在本地使用main方法啟動spring的方法 public static void main(String[] args) throws Except...
摘要:屬性上篇文章中,提到在獲取擴(kuò)展點接口對應(yīng)的的時候,會執(zhí)行私有構(gòu)造函數(shù)。因為此時是,即當(dāng)為時,即我們可以看出,所有非擴(kuò)展點接口都會執(zhí)行對應(yīng)的實例的方法返回一個實例,即對象。 spring是如何獲得容器中管理的類的 拿到applicationContext,就可以調(diào)用getBean方法來獲得Spring的bean對象了 public class SpringContextUtil impl...
摘要:要構(gòu)建自適應(yīng)實例,先要有自適應(yīng)的實現(xiàn)類,實現(xiàn)類有兩種方式一種通過配置文件,一種是通過是字節(jié)碼的方式動態(tài)生成。 SPI機(jī)制 SPI,即(service provider interface)機(jī)制,有很多組件的實現(xiàn),如日志、數(shù)據(jù)庫訪問等都是采用這樣的方式,一般通用組件為了提升可擴(kuò)展性,基于接口編程,將操作接口形成標(biāo)準(zhǔn)規(guī)范,但是可以開放多種擴(kuò)展實現(xiàn),這種做法也符合開閉設(shè)計原則,使組件具有可插...
閱讀 1626·2021-11-19 09:55
閱讀 2857·2021-09-06 15:02
閱讀 3653·2019-08-30 15:53
閱讀 1284·2019-08-29 16:36
閱讀 1390·2019-08-29 16:29
閱讀 2377·2019-08-29 15:21
閱讀 696·2019-08-29 13:45
閱讀 2746·2019-08-26 17:15