天天看点

【dubbo源码解析】 --- dubbo spi 机制之@Activate简介

本文对应源码地址:https://github.com/nieandsun/dubbo-study <code>注意:</code>dubbo 要求SPI扩展点的实现类必须要有一个无参构造,除了Wrapper实现类之外

1 @Activate标签的应用场景

2 @Activate标签 及其使用简介

2.1 简单看一下@Activate标签的源码

2.2 @Activate标签的使用姿势

2.2.1 定义标有@Activate注解的实现类

2.2.2 在META-INFO/dubbo文件夹下建立配置文件

2.2.3 测试

除了上篇文章《【dubbo源码解析】 — dubbo spi 机制(@SPI、@Adaptive)详解》介绍的内容之外,其实dubbo对SPI机制还进行了一个重要的扩展。

举例来说:在工作中,某种时候存在这样的情形,需要同时启用某个接口的多个实现类,如Filter过滤器。我们希望某种条件下启用这一批实现,而另一种情况下启用那一批实现,比如:希望RPC调用的消费端和服务端,分别启用不同的两批Filter,这该怎么处理呢? —&gt; 这时候dubbo的条件激活注解@Activate,就可以派上用场了。

Activate注解表示一个扩展是否被激活(使用),可以放在类定义和方法(本文不讲)上,dubbo将它标注在spi的扩展类上,表示这个扩展实现激活条件和时机。它有两个设置过滤条件的字段,group,value 都是字符数组。 用来指定这个扩展类在什么条件下激活。

首先来看一下@Activate注解的源代码

可以看到@Activate注解主要有五个可选参数,其实before和after标注了@Deprecated ,因此本文也不对这两个可选参数做过多研究了,有兴趣的可以自己试验或查阅资料。

先定义一些Filter(org.apache.dubbo.rpc.Filter),并标注上@Activate注解。

<code>注意:</code>该Filter是dubbo的Filter,接口上有@SPI注解 —&gt;即该接口是一个dubbo的SPI扩展点。

<code>【情况一】</code> @Activate注解里只有group, 表明当调用方只要传递的group中有一个该注解里指定的组员就可以激活该Filter
<code>【情况二】</code> @Activate注解里既有group,又有order ,通过@Activate的源码可知,默认情况下order = 0
<code>【情况三】</code> @Activate注解里既有group、order 又有value

其次当然是要在META-INFO/dubbo文件夹下建立一个配置文件了,内容如下:

【dubbo源码解析】 --- dubbo spi 机制之@Activate简介
<code>【测试1】</code> url里什么参数都不传,但指定group
相信你肯定可以猜到被调用的过滤器及其顺序为: A —&gt; C —&gt; D

测试结果如下:

【dubbo源码解析】 --- dubbo spi 机制之@Activate简介
<code>【测试2】</code> url里指定参数MMMM时(<code>注意,参数后面的value不重要,可以是66666也可以是99999,随意指定都ok</code>)的情况
这时候你可能会认为只有E过滤器被调用了,其实不是,因为 E过滤器激活的条件是【group 为nrsc或yoyo,且URL中必须有MMMM参数】 但是B、D过滤器的激活条件是只要group为nrsc就ok 所以此时被调用的过滤器及其顺序应该为:E —&gt; B —&gt; D
【dubbo源码解析】 --- dubbo spi 机制之@Activate简介
<code>【测试3】</code> url里指定参数MMMM且额外指定去除或增加某个,或某几个实现类的情况
相信看了上面的注释,你可能会再结合一下order的取值,认为此时被调用的过滤器及其顺序应该为:E —&gt; B —&gt; C 但是并不是,因为中间那个参数指定的要增加或减少实现类,实际上却并不是,具体原因有兴趣的可以翻翻源码
【dubbo源码解析】 --- dubbo spi 机制之@Activate简介

end!!!