dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解
dubbo擴(kuò)展點(diǎn)的AOP
對(duì)dubbo的擴(kuò)展點(diǎn)做一些切面功能的擴(kuò)展
ExtensionLoader createExtension
從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<Class<?>> 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ò)展接口實(shí)現(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 static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) { Invoker<T> last = invoker; List<Filter> 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<T> next = last; last = new Invoker<T>() { public Class<T> 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 <T> Exporter<T> export(Invoker<T> 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 <T> Invoker<T> refer(Class<T> 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放到一個(gè)包裝類中,然后經(jīng)過一層包裝之后,在放到另外一個(gè)包裝類中,
通過這種方式dubbo實(shí)現(xiàn)了擴(kuò)展點(diǎn)的AOP
遇到的設(shè)計(jì)模式
- 裝飾器模式
- 動(dòng)態(tài)代理模式
多次使用裝飾類,實(shí)現(xiàn)了dubbo擴(kuò)展點(diǎn)的AOP功能
以上就是dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解的詳細(xì)內(nèi)容,更多關(guān)于dubbo擴(kuò)展點(diǎn)AOP的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java線程之鎖對(duì)象Lock-同步問題更完美的處理方式代碼實(shí)例
這篇文章主要介紹了Java線程之鎖對(duì)象Lock-同步問題更完美的處理方式代碼實(shí)例,還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考。2017-11-11詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息
這篇文章主要為大家介紹了SpringBoot-Start組件開發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04SpringBoot?使用AOP?+?Redis?防止表單重復(fù)提交的方法
Spring?Boot是一個(gè)用于構(gòu)建Web應(yīng)用程序的框架,通過AOP可以實(shí)現(xiàn)防止表單重復(fù)提交,本文介紹了在Spring?Boot應(yīng)用程序中使用AOP和Redis來防止表單重復(fù)提交的方法,需要的朋友可以參考下2023-04-04SpringBoot DevTools之開發(fā)工具與熱部署機(jī)制詳解
本文將深入探討Spring Boot DevTools的核心功能、配置方法以及最佳實(shí)踐,幫助開發(fā)者顯著提升開發(fā)效率,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04DoytoQuery中的關(guān)聯(lián)查詢方案示例詳解
這篇文章主要為大家介紹了DoytoQuery中的關(guān)聯(lián)查詢方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理
這篇文章主要介紹了Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理,包括類與方法以及多態(tài)等支持面向?qū)ο笳Z言中的重要特點(diǎn),需要的朋友可以參考下2016-01-01