dubbo源碼(五)-Activate使用

前言

Activate注解標(biāo)識一個擴(kuò)展是否被激活和使用鼻弧,可以放在定義的類上和方法上习霹,dubbo用它在SPI擴(kuò)張類定義上呜投,標(biāo)識這個擴(kuò)展實現(xiàn)激活的條件和時機(jī)加匈,先看下定義:

/**
 * Activate. This annotation is useful for automatically activate certain extensions with the given criteria,
 * for examples: <code>@Activate</code> can be used to load certain <code>Filter</code> extension when there are
 * multiple implementations.
 * <ol>
 * <li>{@link Activate#group()} specifies group criteria. Framework SPI defines the valid group values.
 * <li>{@link Activate#value()} specifies parameter key in {@link URL} criteria.
 * </ol>
 * SPI provider can call {@link ExtensionLoader#getActivateExtension(URL, String, String)} to find out all activated
 * extensions with the given criteria.
 *
 * @see SPI
 * @see URL
 * @see ExtensionLoader
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Activate {
    /**
     * Activate the current extension when one of the groups matches. The group passed into
     * {@link ExtensionLoader#getActivateExtension(URL, String, String)} will be used for matching.
     *
     * @return group names to match
     * @see ExtensionLoader#getActivateExtension(URL, String, String)
     */
    String[] group() default {};

    /**
     * Activate the current extension when the specified keys appear in the URL's parameters.
     * <p>
     * For example, given <code>@Activate("cache, validation")</code>, the current extension will be return only when
     * there's either <code>cache</code> or <code>validation</code> key appeared in the URL's parameters.
     * </p>
     *
     * @return URL parameter keys
     * @see ExtensionLoader#getActivateExtension(URL, String)
     * @see ExtensionLoader#getActivateExtension(URL, String, String)
     */
    String[] value() default {};

    /**
     * Relative ordering info, optional
     *
     * @return extension list which should be put before the current one
     */
    String[] before() default {};

    /**
     * Relative ordering info, optional
     *
     * @return extension list which should be put after the current one
     */
    String[] after() default {};

    /**
     * Absolute ordering info, optional
     *
     * @return absolute ordering info
     */
    int order() default 0;
}

看到這里大家應(yīng)該明白,Activate就是定義擴(kuò)展點(diǎn)實現(xiàn)類激活的條件仑荐,當(dāng)程序運(yùn)行的參數(shù)滿足這些條件時雕拼,自動激活這些擴(kuò)展點(diǎn)實現(xiàn)類。調(diào)用方法是ExtensionLoader#getActivateExtension粘招。

接下來我們看看Activate注解的使用啥寇。

使用示例

  1. 首先定義一個接口,取名為ActivateExt洒扎,代碼如下:
/**
 * {@link com.alibaba.dubbo.common.extension.Activate} 使用
 *
 * @author hui.wang09
 * @since 31 January 2019
 */
@SPI
public interface ActivateExt {

    String echo(String msg);
}
  1. 定義五個實現(xiàn)類辑甜,如下:
/**
 * {@link ActivateExt} impl
 *
 * @author hui.wang09
 * @since 31 January 2019
 */
@Activate(group = {"default_group"})
public class DefaultActivateExtImpl implements ActivateExt{

    @Override
    public String echo(String msg) {
        return msg;
    }
}
/**
 * {@link ActivateExt} impl
 *
 * @author hui.wang09
 * @since 31 January 2019
 */
@Activate(group = {"group1", "default_group"})
public class GroupActivateExtImpl implements ActivateExt{

    @Override
    public String echo(String msg) {
        return msg;
    }
}
/**
 * {@link ActivateExt} impl
 *
 * @author hui.wang09
 * @since 31 January 2019
 */
@Activate(order = 2, group = {"order"})
public class OrderActivateExtImpl implements ActivateExt{

    @Override
    public String echo(String msg) {
        return msg;
    }
}
/**
 * {@link ActivateExt} impl
 *
 * @author hui.wang09
 * @since 31 January 2019
 */
@Activate(order = 1, group = {"order"})
public class OrderActiveExtImplMore implements ActivateExt{

    @Override
    public String echo(String msg) {
        return msg;
    }
}
/**
 * {@link ActivateExt} impl
 *
 * @author hui.wang09
 * @since 31 January 2019
 */
@Activate(value = {"myKey"}, group = {"value"})
public class ValueActivateExtImpl implements ActivateExt{

    @Override
    public String echo(String msg) {
        return msg;
    }
}
  1. 接著在META-INF/dubbo文件夾下創(chuàng)建一個文件,名稱為ActivateExt的全限定名com.hui.wang.dubbo.learn.dubbo.activate.ActivateExt逊笆,內(nèi)容如下:
group=com.hui.wang.dubbo.learn.dubbo.activate.GroupActivateExtImpl
order1=com.hui.wang.dubbo.learn.dubbo.activate.OrderActiveExtImplMore
order2=com.hui.wang.dubbo.learn.dubbo.activate.OrderActivateExtImpl
value=com.hui.wang.dubbo.learn.dubbo.activate.ValueActivateExtImpl
com.hui.wang.dubbo.learn.dubbo.activate.DefaultActivateExtImpl

到這里栈戳,前期的準(zhǔn)備完成,下面開始我們的測試使用階段

使用一: 關(guān)于ActivateExt注解的group的使用难裆,代碼如下:

    @Test
    public void testGroup() {
        ExtensionLoader<ActivateExt> extExtensionLoader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
        URL url = URL.valueOf("test://localhost/test");

        List<ActivateExt> list = extExtensionLoader.getActivateExtension(url, new String[]{}, "default_group");
        list.forEach(o -> System.out.println(o.echo(o.getClass().getName())));
    }

打印結(jié)果為:

com.hui.wang.dubbo.learn.dubbo.activate.GroupActivateExtImpl
com.hui.wang.dubbo.learn.dubbo.activate.DefaultActivateExtImpl

這里可以看到命中了Activate注解groupdefault_group的擴(kuò)展點(diǎn)實例子檀。

使用二: 關(guān)于Activate注解的value的使用,代碼如下:

    @Test
    public void testValue() {
        ExtensionLoader<ActivateExt> extExtensionLoader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
        URL url = URL.valueOf("test://localhost/test");

        /**
         * 對應(yīng) @Activate(value = {"myKey"})
         */
        url = url.addParameter("myKey", "test");

        List<ActivateExt> list = extExtensionLoader.getActivateExtension(url, new String[]{}, "value");
        list.forEach(o -> System.out.println(o.echo(o.getClass().getName())));
    }

打印結(jié)果為:

com.hui.wang.dubbo.learn.dubbo.activate.ValueActivateExtImpl

可以看到命中了Activate注解groupvalue乃戈,且valuemyKey的擴(kuò)展點(diǎn)實例褂痰。

使用三: 關(guān)于Activate注解order的使用,代碼如下:

    @Test
    public void test3() {
        ExtensionLoader<ActivateExt> extExtensionLoader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
        URL url = URL.valueOf("test://localhost/test");

        List<ActivateExt> list = extExtensionLoader.getActivateExtension(url, new String[]{}, "order");
        list.forEach(o -> System.out.println(o.echo(o.getClass().getName())));
    }

打印結(jié)果為:

com.hui.wang.dubbo.learn.dubbo.activate.OrderActiveExtImplMore
com.hui.wang.dubbo.learn.dubbo.activate.OrderActivateExtImpl

可以看到命中了Activate注解grouporder的擴(kuò)展點(diǎn)實例症虑,且order低的優(yōu)先級高

結(jié)尾

關(guān)于Activate注解的基本使用已經(jīng)講解完了缩歪,在下節(jié)我們將具體講一下Activate的源碼實現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谍憔,一起剝皮案震驚了整個濱河市匪蝙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌习贫,老刑警劉巖逛球,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苫昌,居然都是意外死亡颤绕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奥务,“玉大人物独,你說我怎么就攤上這事÷仍幔” “怎么了挡篓?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溢谤。 經(jīng)常有香客問我瞻凤,道長,這世上最難降的妖魔是什么世杀? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肝集,結(jié)果婚禮上瞻坝,老公的妹妹穿的比我還像新娘。我一直安慰自己杏瞻,他們只是感情好所刀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捞挥,像睡著了一般浮创。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砌函,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天斩披,我揣著相機(jī)與錄音,去河邊找鬼讹俊。 笑死垦沉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仍劈。 我是一名探鬼主播厕倍,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贩疙!你這毒婦竟也來了讹弯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤这溅,失蹤者是張志新(化名)和其女友劉穎组民,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芍躏,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邪乍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庇楞。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡榜配,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吕晌,到底是詐尸還是另有隱情蛋褥,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布睛驳,位于F島的核電站烙心,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乏沸。R本人自食惡果不足惜淫茵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹬跃。 院中可真熱鬧匙瘪,春花似錦、人聲如沸蝶缀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁都。三九已至碍论,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柄慰,已是汗流浹背鳍悠。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留先煎,地道東北人贼涩。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像薯蝎,于是被迫代替她去往敵國和親遥倦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一.概覽 整體描述 dubbo利用spi擴(kuò)展機(jī)制實現(xiàn)大量的動態(tài)擴(kuò)展占锯,要想充分了解dubbo的擴(kuò)展機(jī)制袒哥,首先必須弄明...
    致慮閱讀 873評論 0 2
  • Dubbo采用微內(nèi)核+插件體系,使得設(shè)計優(yōu)雅消略,擴(kuò)展性強(qiáng)堡称。那所謂的微內(nèi)核+插件體系是如何實現(xiàn)的呢!大家是否熟悉spi...
    carl_zhao閱讀 932評論 1 3
  • 0 前言 站在一個框架作者的角度來說艺演,定義一個接口却紧,自己默認(rèn)給出幾個接口的實現(xiàn)類桐臊,同時 允許框架的使用者也能夠自定...
    七寸知架構(gòu)閱讀 16,190評論 3 67
  • Dubbo是什么 Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方式來架構(gòu)晓殊,使用這種方式...
    Coselding閱讀 17,168評論 3 196
  • 過去在我身后膨脹断凶,膨脹,膨脹 我背冒冷汗 回憶將我壓爆巫俺,撕裂 我抓不住它半根汗毛 只能由過往牽著认烁,被未來拖走 上一...
    許思言閱讀 198評論 0 0