dubbo spi 简介
@Adaptive的key获取规则dubbo spi 查找位置spi文件内容 总结
dubbo spi 简介涉及注解
注解 作用
Adaptive用法
1类上: 此时获取的自适应类是非动态代理类,由该类自行完成方法调用逻辑
Compiler compiler = ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension()
@Adaptive public class AdaptiveCompiler implements Compiler { 非动态编译类,完成自适应选择 @Override public Class> compile(String code, ClassLoader classLoader) { Compiler compiler; ExtensionLoaderloader = ExtensionLoader.getExtensionLoader(Compiler.class); String name = DEFAULT_COMPILER; if (name != null && name.length() > 0) { compiler = loader.getExtension(name); } else { compiler = loader.getDefaultExtension(); } return compiler.compile(code, classLoader); } }
方法上
@SPI("dubbo") public interface Protocol { @AdaptiveInvoker refer(Class type, URL url) throws RpcException; } ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()
1 此时获取的类是一个动态代理类,调用方法时 根据Adaptive注解的value值获取url参数上的key,根据该key对应的value值获取对应的Protocol实现类
2 比如url为*****?protocol=dubbo,则调用DubboProtocol.refer
Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension() protocol.refer(type,url);@Adaptive的key获取规则
1 配置了val ,则获取url上的key为该val
@SPI(RandomLoadBalance.NAME) public interface LoadBalance { 直接取URL上loadbalance = XX @Adaptive("loadbalance")Invoker select(List > invokers, URL url, Invocation invocation) throws RpcException; }
2 配置了val数组 则获取url上的key为该val数组的顺序
public interface Transporter extends org.apache.dubbo.remoting.Transporter { 先取URL上server=XX,取不到再取transporter=XX @Adaptive({"server","transporter"}) }
3 没有配置 ,比如刚刚的Protocol接口,则val为接口名驼峰转点号
则取url上abc.efg |=XX 而Protocol接口取protocol就是该规则产生
xx就是下文spi文件 的key=value 的key
dubbo spi 查找位置总结dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
为什么使用dubboSPI ,dubbo spi实例化时根据URL入参决定具体实例化哪个实现类,避免jdk那样全盘实例化,提高资源响应速度,按需加载介绍spi的配置位置,配置格式介绍Adaptive注解作用于方法和类上的区别介绍Spi注解作用,标记以及默认实现类的命名
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)