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搞懂一半了 , 剩下就是一些服务导出 , 服务引入 , 服务调用的过程了
推荐阅读
-
Nice好车|快来看看有没有你的,BBA销售推荐最值得购买的车型
-
地下城与勇士|DNF:第一战法易主,跟风+专利一哥出手,狂人只能望其项背
-
界面新闻 5月21日黑龙江无症状感染者全部“清零”
-
-
天天有料|江苏省有望“合并”的2座城市名单曝光,一旦成功,或将赶超上海
-
网贷平台|又一网贷平台“暴雷”,曾有2亿用户稳如支付宝,现回款难如登天
-
蛋白质|想提高减肥效率?坚持“3多吃、4不吃”原则,减肥速度比别人快
-
交易日|百联股份:股票交易异常波动 无未披露的重大信息
-
-
-
请问有经验的女生,真的“once go black, never go back” 吗
-
-
-
黄金价格|见证历史!金价突破2000美元,大妈们在“心动”,黄金又火了?
-
笑得很丑咋办有没有啥切实可行的办法能训练得笑起来爽朗阳光点
-
-
鲤鱼|钓鱼不要再聚堆了,老钓位有哪些缺点?快来了解一下
-
oj-梅奥|三节轻取23+7+6!梅奥得分助攻一把抓 辽篮真找对人了
-
-
楚汉|任命升官、平调降职,古代是这么表达官职的变化