建议先阅读上一篇文章Dubbo之@Adaptive,效果更佳。
关键词:@Activate
在《Dubbo之@SPI》和《Dubbo之@Adaptive》中分别介绍了@SPI和@Adaptive的使用和功能,你会发现,前面这两个注解,通常方法只能获取到一个结果,可是有时候需要获取到多个结果该怎么办?这个时候,@Activate就站出来了。
@Activate可以标注在多个实现类上,并通过方法getActivateExtension获取到的也是一个集合。我感觉这个注解的逻辑是三个注解中最绕人的。@Activate可以作用在类上和方法上。
public @interface Activate {
// 设置该实现类的分组名。当获取默认实现类的时候,会过滤掉分组不匹配的实现类
String[] group() default {};
// 用于默认实现类的过滤条件。当配置的value值,在指定的URL中有个参数key和其一样(key.equals(value)))或key以.+value结尾(key.endWith("."+vaue))),
// 并且通过url.getParamter(key)!=null,则匹配,否则过滤掉此实现类
String[] value() default {};
// 对默认实现类进行排序,即设置调用的先后顺序。设置在哪些Activate之前被调用
// 填写扩展实现类的配置key
// 排序逻辑见ActivateComparator类
String[] before() default {};
// 设置在哪些扩展实现类之后被调用
String[] after() default {};
// 排序。数值越小,排序越前
int order() default 0;
}
█ 如何使用
关于标注在类上的使用,就不去创建接口和配置了。我们来看下Dubbo自带的com.alibaba.dubbo.rpc.Filter接口,该接口是一个SPI接口,实现类上被标注了@Activate接口。配置文件的内容如下。
cache=com.alibaba.dubbo.cache.filter.CacheFilter
validation=com.alibaba.dubbo.validation.filter.ValidationFilter
echo=com.alibaba.dubbo.rpc.filter.EchoFilter
generic=com.alibaba.dubbo.rpc.filter.GenericFilter
genericimpl=com.alibaba.dubbo.rpc.filter.GenericImplFilter
token=com.alibaba.dubbo.rpc.filter.TokenFilter
accesslog=com.alibaba.dubbo.rpc.filter.AccessLogFilter
activelimit=com.alibaba.dubbo.rpc.filter.ActiveLimitFilter
classloader=com.alibaba.dubbo.rpc.filter.C