甜腻的嘴角|Dubbo如何通过SPI提高框架的可扩展性?( 五 )

consumer组和provide组都能激活这个filter , 同时url中指定key的value为cache
@Activate(group = {"consumer", "provider"}, value = "http://kandian.youth.cn/index/cache")public class MyCacheFilter implements MyFilter {@Overridepublic void filter() {}}测试类如下getActivateExtension有3个参数 , 依次为url, key, group
public class ActivateDemo {public static void main(String[] args) {ExtensionLoader extensionLoader = ExtensionLoader.getExtensionLoader(MyFilter.class);// url中没有参数URL url = URL.valueOf("test://localhost");List allFilterList = extensionLoader.getActivateExtension(url, "", null);/*** org.apache.dubbo.activate.MyConsumerFilter@53e25b76* org.apache.dubbo.activate.MyProviderFilter@73a8dfcc* org.apache.dubbo.activate.MyLogFilter@ea30797** 不指定组则所有的Filter都被激活*/allFilterList.forEach(item -> System.out.println(item));System.out.println();List consumerFilterList = extensionLoader.getActivateExtension(url, "", "consumer");/*** org.apache.dubbo.activate.MyConsumerFilter@53e25b76* org.apache.dubbo.activate.MyLogFilter@ea30797** 指定consumer组 , 则只有consumer组的Filter被激活*/consumerFilterList.forEach(item -> System.out.println(item));System.out.println();// url中有参数myfilterurl = URL.valueOf("test://localhost?myfilter=cache");List customerFilter = extensionLoader.getActivateExtension(url, "myfilter", "consumer");/*** org.apache.dubbo.activate.MyConsumerFilter@53e25b76* org.apache.dubbo.activate.MyLogFilter@ea30797* org.apache.dubbo.activate.MyCacheFilter@aec6354** 指定key在consumer组的基础上 , MyCacheFilter被激活*/customerFilter.forEach(item -> System.out.println(item));System.out.println();}}总结一下就是 , getActivateExtension不指定组就是激活所有的Filter , 指定组则激活指定组的Filter 。 指定key则从Url中根据key取到对应的value , 假设为cache , 然后把@Activate注解中value=http://kandian.youth.cn/index/cache的Filter激活
即group用来筛选 , value用来追加 , Dubbo Filter就是靠这个属性激活不同的Filter的
ExtensionLoader的工作原理ExtensionLoader是整个Dubbo SPI的主要实现类 , 有如下三个重要方法 , 搞懂这3个方法基本上就搞懂Dubbo SPI了 。
加载扩展类的三种方法如下

  1. getExtension() , 获取普通扩展类
  2. getAdaptiveExtension() , 获取自适应扩展类
  3. getActivateExtension() , 获取自动激活的扩展类
getExtension()上面的例子中已经有了 。 自适应的特性上面已经演示过了 , 当获取Wheel的实现类是框架会调用getAdaptiveExtension()方法 。
代码就不放了 , 这3个方法的执行过程还是比较简单的 , 如果你有看不懂的 , 可以看我给源码加的注释 。
【甜腻的嘴角|Dubbo如何通过SPI提高框架的可扩展性?】理解了Dubbo SPI你应该就把Dubbo搞懂一半了 , 剩下就是一些服务导出 , 服务引入 , 服务调用的过程了


推荐阅读