其他分享
首页 > 其他分享> > Dubbo-Activate实现原理

Dubbo-Activate实现原理

作者:互联网

前言

在Dubbo中有Filter使用,对于Filter来说我们会遇到这样的问题,Filter自身有很多的实现,我们希望某种条件下使用A实现,另外情况下使用B实现,这个时候我们前面介绍@SPI和@Adaptive就不能满足我们要求了,这个时候我们就需要使用@Activate。 Activate注解表示一个扩展是否被激活(使用),可以放在类定义和方法上,Dubbo中用它在扩展类定义上,表示这个扩展实现激活条件和时机。

如何使用

  1. 自定义接口;
@SPI
public interface ActivateDemo {

    /**
     * 测试
     * @param msg
     * @return
     */
    String test(String msg);

}
  1. 实现接口,分别进行默认实现、多个组、排序、从URL获取值,多种方式的案例;
@Activate(group = {"default"})
public class DefaultActivateDemoImpl implements ActivateDemo {
    @Override
    public String test(String msg) {
        return msg;
    }
}

@Activate(group = {"groupA","groupB"})
public class ComposeGroupActivateDemoImpl implements ActivateDemo {

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

@Activate(order = 1, group = {"order"})
public class Order1ActivateDemoImpl implements ActivateDemo{
    @Override
    public String test(String msg) {
        return msg;
    }
}

@Activate(order = 2, group = {"order"})
public class Order2ActivateDemoImpl implements ActivateDemo{
    @Override
    public String test(String msg) {
        return msg;
    }
}

@Activate(value = {"value"}, group = {"group"})
public class ValueAndGroupActivateDemoImpl implements ActivateDemo{
    @Override
    public String test(String msg) {
        return msg;
    }
}
测试案例;
    public static void main(String[] args) {  
        
        ExtensionLoader<ActivateDemo> loader = ExtensionLoader.getExtensionLoader(ActivateDemo.class);
        URL url = URL.valueOf("test://localhost/test");
        List<ActivateDemo> list = loader.getActivateExtension(url, new String[]{}, "order");
        System.out.println(list.size());
        list.forEach(item -> System.out.println(item.getClass()));
    
    }
    public static void main(String[] args) {
        ExtensionLoader<ActivateDemo> loader = ExtensionLoader.getExtensionLoader(ActivateDemo.class);
        URL url = URL.valueOf("test://localhost/test");
        //注意这里要使用url接收,不能直接url.addParameter()
        url = url.addParameter("value", "test");
        List<ActivateDemo> list = loader.getActivateExtension(url, new String[]{"order1", "default"}, "group");
        System.out.println(list.size());
        list.forEach(item -> System.out.println(item.getClass()));
    }

源码分析

@Activate注解标注在扩展实现类上,有 group、value 以及 order 三个属性,三个属性作用如下:

  1. group 修饰的实现类可以列举为一种标签,标签用来区分是在 Provider 端被激活还是在 Consumer 端被激活;
  2. value 修饰的实现类只在 URL 参数中出现指定的 key 时才会被激活;
  3. order 用来确定扩展实现类的排序;

标签:Activate,实现原理,Dubbo,测试案例,端被激活
来源: