白话dubbo spi和javaspi的区别
问题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 一样。此扩展类就是我要选择的