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了 。
加载扩展类的三种方法如下
- getExtension() , 获取普通扩展类
- getAdaptiveExtension() , 获取自适应扩展类
- getActivateExtension() , 获取自动激活的扩展类
getExtension()上面的例子中已经有了 。 自适应的特性上面已经演示过了 , 当获取Wheel的实现类是框架会调用getAdaptiveExtension()方法 。
代码就不放了 , 这3个方法的执行过程还是比较简单的 , 如果你有看不懂的 , 可以看我给源码加的注释 。
【甜腻的嘴角|Dubbo如何通过SPI提高框架的可扩展性?】理解了Dubbo SPI你应该就把Dubbo搞懂一半了 , 剩下就是一些服务导出 , 服务引入 , 服务调用的过程了
推荐阅读
-
几品飞车|成618最大赢家,国产输得惨不忍睹,iPhone11销量90万部
-
手机游戏@DNF手游上线时间已定!玩家:这只是开胃菜,还有更好玩的
-
-
【】中方敦促美方停止对所谓“人民币汇率低估”进行反补贴调查
-
五菱宏光|五菱MINI的对手来了,3万出头,标配空调气囊,颜值堪比甲壳虫
-
开悟|开悟的人最可怕,人生至高境界,全在《金刚经》这三句话中
-
#寺庙#西安被“遗忘”的景区,废弃很久售票厅无人看管,本地人却喜欢去
-
特朗普|特朗普感染新冠西方人是这么说的:中国的孙子兵法没少看!
-
AMD|AMD Zen5+Zen4D大小核混合三种工艺?3nm+5nm+6nm
-
-
【嘿科技在这里】AI打击野生动物非法贸易,一周AI大事盘点:首个活体机器人诞生
-
邱叔时尚风景线|简直萌翻了,李沁这次穿搭惊艳到我了!上有橙子下有西瓜
-
-
-
范蠡|金庸笔下第一美女战神,自己悟出绝世剑法,最后却沦为男人的玩物
-
-
-
你的拍照男友|时尚服装对于大众而言就是简单舒适,知性美搭配,散发出迷人魅力
-
王者荣耀|拖米称:KPL秋季赛“4大金刚”已确定3个,RW跟EDGM争倒数第1!
-
[轻型坦克]美国最新坦克,曝光了!我15式坦克比它强太多,有来自娘胎的优势