欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解

 更新時(shí)間:2023年08月16日 10:45:52   作者:包月星  
這篇文章主要為大家介紹了dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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í)例

    這篇文章主要介紹了Java線程之鎖對(duì)象Lock-同步問題更完美的處理方式代碼實(shí)例,還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考。
    2017-11-11
  • 詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    這篇文章主要為大家介紹了SpringBoot-Start組件開發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Spring?Boot集成etcd的詳細(xì)過程

    Spring?Boot集成etcd的詳細(xì)過程

    etcd是一個(gè)分布式鍵值存儲(chǔ)數(shù)據(jù)庫,用于共享配置和服務(wù)發(fā)現(xiàn),etcd采用Go語言編寫,具有出色的跨平臺(tái)支持,很小的二進(jìn)制文件和強(qiáng)大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下
    2023-08-08
  • 詳解java中繼承關(guān)系類加載順序問題

    詳解java中繼承關(guān)系類加載順序問題

    這篇文章主要介紹了詳解java中繼承關(guān)系類加載順序問題的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • SpringBoot?使用AOP?+?Redis?防止表單重復(fù)提交的方法

    SpringBoot?使用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-04
  • Java Swing JPanel面板的使用方法

    Java Swing JPanel面板的使用方法

    這篇文章主要介紹了Java Swing JPanel面板的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringBoot DevTools之開發(fā)工具與熱部署機(jī)制詳解

    SpringBoot DevTools之開發(fā)工具與熱部署機(jī)制詳解

    本文將深入探討Spring Boot DevTools的核心功能、配置方法以及最佳實(shí)踐,幫助開發(fā)者顯著提升開發(fā)效率,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • DoytoQuery中的關(guān)聯(lián)查詢方案示例詳解

    DoytoQuery中的關(guān)聯(lián)查詢方案示例詳解

    這篇文章主要為大家介紹了DoytoQuery中的關(guān)聯(lián)查詢方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    這篇文章主要介紹了Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理,包括類與方法以及多態(tài)等支持面向?qū)ο笳Z言中的重要特點(diǎn),需要的朋友可以參考下
    2016-01-01
  • Java中使用DOM和SAX解析XML文件的方法示例

    Java中使用DOM和SAX解析XML文件的方法示例

    這篇文章主要介紹了Java中使用DOM和SAX解析XML文件的方法示例,通過實(shí)例文章中最后也給出了一些對(duì)比結(jié)論,需要的朋友可以參考下
    2015-11-11

最新評(píng)論