成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Dubbo的SPI機(jī)制介紹以及Activate的使用方法

這篇文章主要介紹“Dubbo的SPI機(jī)制介紹以及Activate的使用方法”,在日常操作中,相信很多人在Dubbo的SPI機(jī)制介紹以及Activate的使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Dubbo的SPI機(jī)制介紹以及Activate的使用方法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了大洼免費(fèi)建站歡迎大家使用!

1、Dubbo的@Activate例子

@SPI
public interface ActivateExt {
    String echo(String msg);
}
@Activate(group = {"default"})
public class ActivateExtImpl1 implements ActivateExt {
    @Override
    public String echo(String msg) {
        return msg;
    }
}

@Activate(group = {"group1", "group2"})
public class GroupActivateExtImpl implements ActivateExt {

    @Override
    public String echo(String msg) {
        return msg;
    }
}
@Activate(order = 2, group = {"order"})
public class OrderActivateExtImpl1 implements ActivateExt {

    @Override
    public String echo(String msg) {
        return msg;
    }
}

@Activate(order = 1, group = {"order"})
public class OrderActivateExtImpl2 implements ActivateExt {

    @Override
    public String echo(String msg) {
        return msg;
    }
}
@Activate(value = {"value"}, group = {"group"})
public class ValueActivateExtImpl implements ActivateExt {

    @Override
    public String echo(String msg) {
        return msg;
    }
}

resources下新建META-INF/dubbo/internal文件夾,新建com.alibaba.dubbo.demo.provider.activate.ActivateExt,即接口的全限定名,文件內(nèi)容為:

group=com.alibaba.dubbo.demo.provider.activate.impl.GroupActivateExtImpl
key=com.alibaba.dubbo.demo.provider.activate.impl.ValueActivateExtImpl
order1=com.alibaba.dubbo.demo.provider.activate.impl.OrderActivateExtImpl1
order2=com.alibaba.dubbo.demo.provider.activate.impl.OrderActivateExtImpl2
com.alibaba.dubbo.demo.provider.activate.impl.ActivateExtImpl1

下面是幾個(gè)單元測(cè)試及其測(cè)試結(jié)果,觀察測(cè)試結(jié)果我們可以得出以下結(jié)論:

  1. 如果loader.getActivateExtension(URL url, String[] values, String group)中的group參數(shù)能夠匹配到,就是我們要選擇的,test1中根據(jù)group=default匹配到了ActivateExtImpl1,它也是在此條件下需要激活的

  2. @Activate中的value是第二層校驗(yàn)參數(shù),第一層是group,在group校驗(yàn)通過的情況下,如果URL中的key參數(shù)與類@Activate注解中的value參數(shù)一致且key參數(shù)對(duì)應(yīng)的值不為空,則才會(huì)被選中

  3. order越小,優(yōu)先級(jí)越高

/**
 * 1
 * class com.alibaba.dubbo.demo.provider.activate.impl.ActivateExtImpl1
 */
@Test
public void test1(){
    ExtensionLoader<ActivateExt> loader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
    URL url = URL.valueOf("test://localhost/test");
    List<ActivateExt> list = loader.getActivateExtension(url, new String[]{}, "default");
    System.out.println(list.size());
    list.forEach(item -> System.out.println(item.getClass()));
}
/**
 * 1
 * class com.alibaba.dubbo.demo.provider.activate.impl.GroupActivateExtImpl
 */
@Test
public void test2(){
    ExtensionLoader<ActivateExt> loader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
    URL url = URL.valueOf("test://localhost/test");
    List<ActivateExt> list = loader.getActivateExtension(url, new String[]{}, "group1");
    System.out.println(list.size());
    list.forEach(item -> System.out.println(item.getClass()));
}
/**
 * 2
 * class com.alibaba.dubbo.demo.provider.activate.impl.OrderActivateExtImpl1
 * class com.alibaba.dubbo.demo.provider.activate.impl.ValueActivateExtImpl
 */
@Test
public void test3(){
    ExtensionLoader<ActivateExt> loader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
    URL url = URL.valueOf("test://localhost/test");
    // 注意這里要使用url接收,不能直接url.addParameter()
    url = url.addParameter("value", "test");
    List<ActivateExt> list = loader.getActivateExtension(url, new String[]{"order1", "default"}, "group");
    System.out.println(list.size());
    list.forEach(item -> System.out.println(item.getClass()));
}
/**
 * 2
 * class com.alibaba.dubbo.demo.provider.activate.impl.OrderActivateExtImpl2
 * class com.alibaba.dubbo.demo.provider.activate.impl.OrderActivateExtImpl1
 */
@Test
public void test4(){
    ExtensionLoader<ActivateExt> loader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
    URL url = URL.valueOf("test://localhost/test");
    List<ActivateExt> list = loader.getActivateExtension(url, new String[]{}, "order");
    System.out.println(list.size());
    list.forEach(item -> System.out.println(item.getClass()));
}

2、源碼分析

public void test3(){
    ExtensionLoader<ActivateExt> loader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
    URL url = URL.valueOf("test://localhost/test");
    // 注意這里要使用url接收,不能直接url.addParameter()
    url = url.addParameter("value", "test");
    List<ActivateExt> list = loader.getActivateExtension(url, new String[]{"order1", "default"}, "group");
    System.out.println(list.size());
    list.forEach(item -> System.out.println(item.getClass()));
}
public List<T> getActivateExtension(URL url, String[] values, String group) {
    List<T> exts = new ArrayList<T>();
    // 將傳遞進(jìn)來的values包裝成List類型的names
    List<String> names = values == null ? new ArrayList<String>(0) : Arrays.asList(values);
    // 包裝好的數(shù)據(jù)中不含"-default"
    if (!names.contains(Constants.REMOVE_VALUE_PREFIX + Constants.DEFAULT_KEY)) {
        // 獲取這個(gè)類型的數(shù)據(jù)的所有擴(kuò)展信息
        getExtensionClasses();
        for (Map.Entry<String, Activate> entry : cachedActivates.entrySet()) {
            // 獲取拓展的名稱,在配置文件中配置的key=value中的key值
            String name = entry.getKey();
            // 獲取注解
            Activate activate = entry.getValue();

            // 判斷group是否匹配,group是程序傳進(jìn)來的值,如果沒有設(shè)定則返回true表示匹配,
            // 如果設(shè)定了需要進(jìn)行比較匹配
            if (isMatchGroup(group, activate.group())) {
                // 獲取key值即name對(duì)應(yīng)的實(shí)例
                T ext = getExtension(name);
                if (!names.contains(name)
                        && !names.contains(Constants.REMOVE_VALUE_PREFIX + name)
                        && isActive(activate, url)) {
                    exts.add(ext);
                }
            }
        }
        // 排序
        Collections.sort(exts, ActivateComparator.COMPARATOR);
    }

    List<T> usrs = new ArrayList<T>();
    for (int i = 0; i < names.size(); i++) {
        String name = names.get(i);
        if (!name.startsWith(Constants.REMOVE_VALUE_PREFIX)
                && !names.contains(Constants.REMOVE_VALUE_PREFIX + name)) {
            if (Constants.DEFAULT_KEY.equals(name)) {
                // 如果name是default,就將usrs加入exts頭部并清空usrs
                if (!usrs.isEmpty()) {
                    exts.addAll(0, usrs);
                    usrs.clear();
                }
            } else {
                // 獲取name對(duì)應(yīng)的拓展并加入usrs
                T ext = getExtension(name);
                usrs.add(ext);
            }
        }
    }
    if (!usrs.isEmpty()) {
        exts.addAll(usrs);
    }
    return exts;
}

上述代碼中用到的cachedActivates是在getExtensionClasses()方法中賦值的,具體可以參考: Dubbo的SPI機(jī)制分析1-SPI加載class

Activate activate = clazz.getAnnotation(Activate.class);
if (activate != null) {
    cachedActivates.put(names[0], activate);
}
// 判斷group是否匹配,很好理解
private boolean isMatchGroup(String group, String[] groups) {
    if (group == null || group.length() == 0) {
        return true;
    }
    if (groups != null && groups.length > 0) {
        for (String g : groups) {
            if (group.equals(g)) {
                return true;
            }
        }
    }
    return false;
}
// 將url中的鍵key與Activate注解中的value值做匹配,并且key所對(duì)應(yīng)的value值不能為空
private boolean isActive(Activate activate, URL url) {
    String[] keys = activate.value();
    if (keys.length == 0) {
        return true;
    }
    for (String key : keys) {
        for (Map.Entry<String, String> entry : url.getParameters().entrySet()) {
            String k = entry.getKey();
            String v = entry.getValue();
            if ((k.equals(key) || k.endsWith("." + key))
                    && ConfigUtils.isNotEmpty(v)) {
                return true;
            }
        }
    }
    return false;
}

注意,如果是以下這種形式,傳入的values中有-default,則所有的匹配可以通過的@Activate都不會(huì)被激活,只有values中指定的可以被激活。如果傳入了“-”符合開頭的擴(kuò)展類名,則該擴(kuò)展點(diǎn)也不會(huì)被激活。

// 輸出class com.alibaba.dubbo.demo.provider.activate.impl.OrderActivateExtImpl1
ExtensionLoader<ActivateExt> loader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
URL url = URL.valueOf("test://localhost/test");
// 注意這里要使用url接收,不能直接url.addParameter()
url = url.addParameter("value", "test");
List<ActivateExt> list = loader.getActivateExtension(url, new String[]{"order1", "-default"}, "group");
System.out.println(list.size());
list.forEach(item -> System.out.println(item.getClass()));

到此,關(guān)于“Dubbo的SPI機(jī)制介紹以及Activate的使用方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

文章標(biāo)題:Dubbo的SPI機(jī)制介紹以及Activate的使用方法
網(wǎng)站URL:http://jinyejixie.com/article36/ghhssg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、響應(yīng)式網(wǎng)站網(wǎng)站維護(hù)、靜態(tài)網(wǎng)站、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)
兴城市| 甘谷县| 永吉县| 花垣县| 靖安县| 禹州市| 碌曲县| 陆河县| 潮安县| 会昌县| 根河市| 雷山县| 小金县| 翼城县| 禹州市| 雷山县| 松桃| 南雄市| 奈曼旗| 鹤山市| 石棉县| 孟连| 乌拉特前旗| 河间市| 嘉兴市| 姜堰市| 天长市| 衡水市| 宁河县| 香河县| 晋宁县| 泸溪县| 霍邱县| 大庆市| 巴马| 台湾省| 朔州市| 高阳县| 镇康县| 潮安县| 滦南县|