老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法

這篇文章主要介紹“Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法”,在日常操作中,相信很多人在Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

成都創新互聯公司總部坐落于成都市區,致力網站建設服務有網站設計制作、成都做網站、網絡營銷策劃、網頁設計、網站維護、公眾號搭建、小程序制作、軟件開發等為企業提供一整套的信息化建設解決方案。創造真正意義上的網站建設,為互聯網品牌在互動行銷領域創造價值而不懈努力!

1、Dubbo的通過Wrapper實現AOP例子

閱讀此篇文章之前,建議先學習該系列前面幾篇文章,會有一個更好的理解.

參考: Dubbo的SPI機制分析2-Adaptive詳解、Dubbo的SPI機制分析3-Dubbo的IOC依賴注入

// 在原有接口、實現類的基礎上再加一個Wrapper實現類
public class AdaptiveExtWrapper implements AdaptiveExt {

    private AdaptiveExt adaptiveExt;

    // 實現一個Wrapper類的關鍵就是提供一個帶類似參數的構造函數,后面代碼會分析
    public AdaptiveExtWrapper(AdaptiveExt adaptiveExt) {
        this.adaptiveExt = adaptiveExt;
    }

    @Override
    public String echo(String msg, URL url) {
        // do something,實現了AOP
        System.out.println("before");

        adaptiveExt.echo(msg, url);

        System.out.println("after");
        // do something
        return "wrapper";
    }
}
public class DubboAdaptiveExt implements AdaptiveExt {

    private AdaptiveExt adaptiveExt;

    // 此處DubboAdaptiveExt依賴注入一個AdaptiveExt 類型的實例,此處測試用例注入的是ThriftAdaptiveExt
    public void setAdaptiveExt(AdaptiveExt adaptiveExt) {
        this.adaptiveExt = adaptiveExt;
    }

    @Override
    public String echo(String msg, URL url) {
        System.out.println(this.adaptiveExt.echo(msg, url));
        return "dubbo";
    }
}

@Test
public void test1(){
    ExtensionLoader loader = ExtensionLoader.getExtensionLoader(AdaptiveExt.class);
    AdaptiveExt adaptiveExtension = loader.getExtension("dubbo");
    URL url = URL.valueOf("test://localhost/test");
    adaptiveExtension.echo("d", url);
}

同時記得dubbo的配置文件中要新增一行,否則dubbo框架無法掃描到Wrapper

dubbo=com.alibaba.dubbo.demo.provider.adaptive.impl.DubboAdaptiveExt
cloud=com.alibaba.dubbo.demo.provider.adaptive.impl.SpringCloudAdaptiveExt
thrift=com.alibaba.dubbo.demo.provider.adaptive.impl.ThriftAdaptiveExt
com.alibaba.dubbo.demo.provider.adaptive.impl.AdaptiveExtWrapper
運行代碼,輸出:
before
thrift
after

2、Dubbo的通過Wrapper實現AOP源碼分析

可以發現,上述代碼先后輸出before、after,中間輸出thrift,這其實可以說明adaptiveExtension = loader.getExtension("dubbo")返回的是AdaptiveExtWrapper類型的實例,有點像靜態代理,下面分析源代碼.

// 核心代碼,刪去一些不重要代碼
private T createExtension(String name) {
    // 這里也是通過dubbo的SPI機制去掃描dubbo的默認目錄下的文件,去加載實現了AdaptiveExt的實現類,這里會
    // 加載4個,包括AdaptiveExtWrapper,它就是下面的wrapperClasses中僅有的元素,下面先分析這個加載過程
    Class clazz = getExtensionClasses().get(name);
   
    try {
        T instance = (T) EXTENSION_INSTANCES.get(clazz);
        if (instance == null) {
            EXTENSION_INSTANCES.putIfAbsent(clazz, clazz.newInstance());
            instance = (T) EXTENSION_INSTANCES.get(clazz);
        }
        // 依賴注入,這里注入的就是ThriftAdaptiveExt類型的實例對象
        injectExtension(instance);
        
        // 所以這里面cachedWrapperClasses包含了AdaptiveExtWrapper類
        Set> wrapperClasses = cachedWrapperClasses;
        if (wrapperClasses != null && !wrapperClasses.isEmpty()) {
            for (Class wrapperClass : wrapperClasses) {
                // 先分析僅有一個Wrapper類的情況,將原有的instance作為參數傳入AdaptiveExtWrapper
                // 生成一個AdaptiveExtWrapper類型的instance,并為該instance依賴注入,這里的instance
                // 沒有什么好注入的
                instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
            }
        }
        return instance;
    } 
}
private void loadClass(Map> extensionClasses, 
              java.net.URL resourceURL, Class clazz, String name) throws NoSuchMethodException {
    // 刪去無關代碼
    // 判斷是否是Wrapper類型
    else if (isWrapperClass(clazz)) {
        Set> wrappers = cachedWrapperClasses;
        if (wrappers == null) {
            cachedWrapperClasses = new ConcurrentHashSet>();
            wrappers = cachedWrapperClasses;
        }
        // 是的話,會用HashSet記錄下它,這說明wrapper類可以配置多個,后面分析多個的情況
        wrappers.add(clazz);
    }
}
 // 這里判斷是Wrapper類的邏輯很簡單,如果該clazz里面有type類型的構造參數,那么它就是,否則會拋出異常,返回false
 private boolean isWrapperClass(Class clazz) {
    try {
        clazz.getConstructor(type);
        return true;
    } catch (NoSuchMethodException e) {
        return false;
    }
}

觀看下圖可以發現,最后生成的instanceAdaptiveExtWrapper類型的,它里面有一個DubboAdaptiveExt類型變量,adaptiveExt里面有一個ThriftAdaptiveExt類型的變量,所以最后調用adaptiveExtension.echo("d", url)時的adaptiveExtension是AdaptiveExtWrapper類型的,所以輸出結果如上,有了AOP的效果. Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法

剛剛分析的只有一個Wrapper類的情況,現在分析有兩個的情況,它的Debug結果如下圖,清晰易懂 Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法

輸出結果是:
before
before2
thrift
after2
after
更新后的配置文件:
dubbo=com.alibaba.dubbo.demo.provider.adaptive.impl.DubboAdaptiveExt
cloud=com.alibaba.dubbo.demo.provider.adaptive.impl.SpringCloudAdaptiveExt
thrift=com.alibaba.dubbo.demo.provider.adaptive.impl.ThriftAdaptiveExt
com.alibaba.dubbo.demo.provider.adaptive.impl.AdaptiveExtWrapper
com.alibaba.dubbo.demo.provider.adaptive.impl.AdaptiveExtWrapper2
public class AdaptiveExtWrapper2 implements AdaptiveExt {

    private AdaptiveExt adaptiveExt;

    public AdaptiveExtWrapper2(AdaptiveExt adaptiveExt) {
        this.adaptiveExt = adaptiveExt;
    }

    @Override
    public String echo(String msg, URL url) {
        // do something,實現了AOP
        System.out.println("before2");

        adaptiveExt.echo(msg, url);

        System.out.println("after2");
        // do something
        return "wrapper";
    }
}

到此,關于“Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!


文章題目:Dubbo的SPI機制介紹以及Dubbo通過Wrapper實現AOP的方法
鏈接地址:http://www.xueling.net.cn/article/ieggge.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国产成人啪精品视频免费网站 | 好爽啊中文字幕一区二区久久 | 国产伦久视频免费观看视频 | 色偷偷日本 | 黄色免费毛片 | 一级偷拍视频 | 年轻的朋友在线 | 国产精品最新资源网 | 国产精品欧美一区乱破 | 九七国产精品 | 99久久中文 | 亚洲精品沙发午睡系列 | 亚洲欧美国产国产综合一区 | 91日韩精品一区 | 张雨绮被揉到高潮下不了床 | 一区二区三区在线视频 | 国产人人澡 | av无码午夜福利一区二区三区 | 被医生绑在妇科椅调教 | www.麻豆com | 美女床上运动 | CAOPORN免费视频国产 | 在线视频自拍 | 欧美韩一区二区 | 777婷婷天堂综合区色吧 | 免费高清网站在线播放的注意事项 | 亚洲国产精品无码专区影院 | 国产激情自拍视频 | 日韩免费无码专区精品观看 | 69re视频| 成人午夜无码精品免费看 | 日本十八禁免费看污网站 | jk校花呻吟迎合娇躯白嫩 | 日本aaaa片毛片免费观蜜桃 | 爱情到此为止在线观看 | 午夜伊人 | 少妇饥渴偷公乱第一章全文 | 99re8在线精品视频免费播放 | 免费看片免费播放国产 | 久久久久久久久网站 | 久草视频在线免费看 |