Dubbo自激活扩展实现原理分析

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值