白话dubbo spi和javaspi的区别

2021-03-28  本文已影响0人  大强斌

问题dubbospi存在的意义是什么?如何实现的?

ExtensionLoader.getExtensionLoader(Filter.class).getExtension("mymock");

dubbo spi 存在的意义

1延时加载,需要再生成,利用缓存机制,缓存名字和实现类对应的关系,如果没有找到,再根据javaspi的技术去利用反射生成,并加入到缓存集合中,方便下次再使用。

2 依赖其他spi接口会自动根据名字查找实现类,并注入属性。.

       代码实现 injectExtension方法。

基本过程:

           1  获取属性字段 ,排除java本身基本的类型。

           2利用反射机制查出要注入的字段属性名字,然后去spi缓存去查找。如果查找出来就会设置属性

 2 可以根据参数,先择我要使用的实现类。

举例

ZookeeperTransporter zookeeperTransporter = ExtensionLoader.getExtensionLoader(ZookeeperTransporter.class).getAdaptiveExtension();

实现原理:动态生成了一个类,实现了ZookeeperTransporter 接口中标注有@Adapter("A")的方法,

大概思想,从入参url 获取@Adapter 注解的值 对应的参数的值,说白了就url.getParameter("A"),值作为名字,再调用ExtensionLoader.getExtensionLoader(Filter.class).getExtension("mymock"); 获取名字对应的实现类。

对应的源码入口

@Activate 作用 1 可以同时激活多个扩展实现,并定义调用的顺序性。举个例子,同时激活 A B  C,扩展类,至于激活的条件,可以通过group 和value进行设置,

group代表 选取标有@Activate  的扩展类的实例,并且扩展类的实例 对应的group属性和Activate设置的属性一样。

value 可以设置 key:value值对,表明Active的扩展类的属性,如果我url传递进来的key value 和扩展类的key value 一样。此扩展类就是我要选择的

上一篇下一篇

猜你喜欢

热点阅读