最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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之PreparedStatement的使用詳解

    Java之PreparedStatement的使用詳解

    這篇文章主要介紹了Java之PreparedStatement的使用詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java 四種基本加密算法分析

    Java 四種基本加密算法分析

    這篇文章主要介紹了Java 四種基本加密算法分析的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java詳細(xì)講解IO流的Writer與Reader操作

    Java詳細(xì)講解IO流的Writer與Reader操作

    Writer與Reader類不能直接調(diào)用,需要使用多帶的方法調(diào)用它們的子類,在他們的前邊加上一個(gè)File即可如(FileWriter或FileReader)的多態(tài)方法進(jìn)行其調(diào)用,并且他們也是抽象類調(diào)用需要連接接口Exception,它們的優(yōu)點(diǎn)在于可以直接寫入或讀出內(nèi)容,不需要使用byte轉(zhuǎn)八進(jìn)制
    2022-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的兩種搜索算法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的兩種搜索算法詳解

    在很多情況下,我們需要遍歷圖,得到圖的一些性質(zhì)。有關(guān)圖的搜索,最經(jīng)典的算法有深度優(yōu)先搜索和廣度優(yōu)先搜索,接下來我們分別講解這兩種搜索算法,需要的可以參考一下
    2022-11-11
  • java常見log日志的使用方法解析

    java常見log日志的使用方法解析

    本文主要介紹了java常見log日志的使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析

    RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析

    這篇文章主要為大家介紹了RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • java實(shí)現(xiàn)全局監(jiān)聽鍵盤詳解

    java實(shí)現(xiàn)全局監(jiān)聽鍵盤詳解

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)全局監(jiān)聽鍵盤的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2024-01-01
  • java實(shí)現(xiàn)Yaml轉(zhuǎn)Json示例詳解

    java實(shí)現(xiàn)Yaml轉(zhuǎn)Json示例詳解

    這篇文章主要為大家介紹了java實(shí)現(xiàn)Yaml轉(zhuǎn)Json示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 基于Ajax用戶名驗(yàn)證、服務(wù)條款加載、驗(yàn)證碼生成的實(shí)現(xiàn)方法

    基于Ajax用戶名驗(yàn)證、服務(wù)條款加載、驗(yàn)證碼生成的實(shí)現(xiàn)方法

    本篇文章對(duì)Ajax用戶名驗(yàn)證、服務(wù)條款加載、驗(yàn)證碼生成的實(shí)現(xiàn)方法,進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • Java將json對(duì)象轉(zhuǎn)換為map鍵值對(duì)案例詳解

    Java將json對(duì)象轉(zhuǎn)換為map鍵值對(duì)案例詳解

    這篇文章主要介紹了Java將json對(duì)象轉(zhuǎn)換為map鍵值對(duì)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

时尚| 离岛区| 宜君县| 揭阳市| 手游| 大同县| 汉川市| 营山县| 定日县| 城步| 兴山县| 沙田区| 安阳市| 平利县| 丹巴县| 方山县| 鄂托克前旗| 广安市| 镇远县| 丰镇市| 莱芜市| 集贤县| 神池县| 红桥区| 威海市| 西峡县| 江永县| 黔西| 莱州市| 楚雄市| 沧源| 阿坝县| 勐海县| 班戈县| 泰来县| 元阳县| 邯郸县| 长春市| 中超| 益阳市| 攀枝花市|