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());
}