Dubbo之Activate

Activate:可以被框架中自动激活加载扩展,此Annotation用于配置扩展被自动激活加载条件。

Activate,看起来有点不好理解,它的意思是条件激活,用户通过group和value配置激活条件。被activate注解的扩展点在满足某种条件时会被激活,它一般用来配合filter和Invokelistener,声明他们的使用场景。我们先来看看源码

 

 

首先你对的dubbo的 SPI机制有一定的了解和研究,

 

我们看看他的用法,来看一个测试例子的流程:

 

对应的配置文件:



接口

@SPI("order1")
public interface ActivateExt1 {
    String echo(String msg);
}

 

对应不同的实现类:

 

@Activate(group = {"default_group"})
public class ActivateExt1Impl1 implements ActivateExt1 {
    public String echo(String msg) {
        return msg;
    }
}

@Activate(group = {"group1", "group2"})
public class GroupActivateExtImpl implements ActivateExt1 {
    public String echo(String msg) {
        return msg;
    }
}

 

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

@Activate(order = 1, group = {"order"})
public class OrderActivateExtImpl2 implements ActivateExt1 {
    public String echo(String msg) {
        return msg;
    }
}

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

 

下面是测试案例

/**
     * 默认实现
     */
    @Test
    public void testDefault() {
        ExtensionLoader<ActivateExt1> loader = ExtensionLoader.getExtensionLoader(ActivateExt1.class);
        URL url = URL.valueOf("test://localhost/test");
       //他会去加载默认的实现 根据default_group 查找对应的实现方法
        List<ActivateExt1> list = loader.getActivateExtension(url, new String[]{}, "default_group");
        //activateext1impl1-----------@com.alibaba.dubbo.common.extension.Activate(after=[], before=[],        value=[], order=0, group=[default_group])
        //找到key了再用spi找到对应的实现类
        System.out.println(list.size()); // 1
        // com.alibaba.dubbo.common.extensionloader.activate.impl.ActivateExt1Impl1
        System.out.println(list.get(0).getClass());
    }

 

/**
     * group 实现的测试
     */
    @Test
    public void testGroup() {
        URL url = URL.valueOf("test://localhost/test");
        // group == group1  或者 group2
        List<ActivateExt1> list  =    ExtensionLoader.getExtensionLoader(ActivateExt1.class).getActivateExtension(url, new String[]{}, "group2");
        //group-----------@com.alibaba.dubbo.common.extension.Activate(after=[], before=[], value=[], order=0, group=[group1, group2])
        System.out.println(list.size());
        //com.alibaba.dubbo.common.extensionloader.activate.impl.GroupActivateExtImpl
        System.out.println(list.get(0).getClass());
    }

 

/**
     * 测试 testValue
     */
    @Test
    public void testValue() {
        URL url = URL.valueOf("test://localhost/test");
        //根据   key = value1,group =  value             
        //@Activate(value = {"value1"}, group = {"value"})来激活扩展
        url = url.addParameter("value1", "value");
        List<ActivateExt1> list  = ExtensionLoader.getExtensionLoader(ActivateExt1.class).getActivateExtension(url, new String[]{}, "value");
        //value-----------@com.alibaba.dubbo.common.extension.Activate(after=[], before=[], value=[value1], order=0, group=[value])
        System.out.println(list.size());
        //com.alibaba.dubbo.common.extensionloader.activate.impl.ValueActivateExtImpl
        System.out.println(list.get(0).getClass());
    }

 

/**
     * 测试 testOrder
     * 测试多group = order
     * 其中 int order() default 0;  排序字段
     */
    @Test
    public void testOrder() {
        URL url = URL.valueOf("test://localhost/test");
        List<ActivateExt1> list = ExtensionLoader.getExtensionLoader(ActivateExt1.class).getActivateExtension(url, new String[]{}, "order");
        //order1-----------@com.alibaba.dubbo.common.extension.Activate(after=[], before=[], value=[], order=2, group=[order])
        //order2-----------@com.alibaba.dubbo.common.extension.Activate(after=[], before=[], value=[], order=1, group=[order])
        System.out.println(list.size());
        //com.alibaba.dubbo.common.extensionloader.activate.impl.OrderActivateExtImpl2  因为order = 1,先输出
        System.out.println(list.get(0).getClass());
        //com.alibaba.dubbo.common.extensionloader.activate.impl.OrderActivateExtImpl1 order = 2
        System.out.println(list.get(1).getClass());
    }

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值