Dubbo的自激活扩展说明
- Dubbo的激活扩展是指根据分组和url参数中的key,结合扩展类上的注解Activate,生成符合匹配条件的扩展实例,得到一个实例集合。
Dubbo中的应用场景
- 激活扩展在Dubbo中一个典型的应用场景就是过滤器(Filter), 在服务端收到请求之后,经过一系列过滤器去拦截请求,做一些处理工作,然后在真正去调用实现类。
@Activate注解说明
/**
* 激活。这个注解对于使用给定的条件自动激活特定的扩展非常有用,例如:当有多个实现时,@Activate可以用于加载特定的过滤器扩展。
* group()指定组条件。框架SPI定义了有效的组值。
* value()指定URL条件中的参数key。
* SPI提供程序可以调用ExtensionLoader.getActivateExtension(URL, String, String)来查找给定条件下所有激活的扩展。
*/
@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.
* 当指定的键出现在URL的参数中时激活当前的扩展。
* 例如,给定@Activate(“cache, validation”),当前的扩展只会在URL的参数中出现cache或validation时返回。
*
* @return URL parameter keys
* @see ExtensionLoader#getActivateExtension(URL, String)
* @see ExtensionLoader#getActivateExtension(URL, String, String)
*/
String[] value() default {
};
/**
* Relative ordering info, optional
* Deprecated since 2.7.0
* 关联顺序,是可选的,2.7.0以后被废弃
* @return extension list which should be put before the current one
*/
@Deprecated
String[] before() default {
};
/**
* Relative ordering info, optional
* Deprecated since 2.7.0
* 关联顺序,是可选的,2.7.0以后被废弃
* @return extension list which should be put after the current one
*/
@Deprecated
String[] after() default {
};
/**
* Absolute ordering info, optional
* 绝对的顺序信息,可选的参数
* @return absolute ordering info
*/
int order() default 0;
}
源码分析(apache dubbo 2.7.8)
- ExtensionLoader关于getActivateExtension有4个重载方法,其中1,2,3最终都会调用方法4,所以我们直接分析方法4的逻辑
1. public List<T> getActivateExtension(URL url, String key) {
return getActivateExtension(url, key, null);
}
2. public List<T> getActivateExtension(URL url, String[] values) {
return getActivateExtension(url, values, null)