dubbo spi 简介
@Adaptive的key获取规则dubbo spi 查找位置spi文件内容 总结
dubbo spi 简介涉及注解
| 注解 | 作用 |
|---|---|
| SPI | 起标注作用,但当value不为空,value表示spi默认实现 |
| Adaptive | 可放置类与方法上,放置类上表示接口的Adaptive类; 放置在方法上,通过动态代理调用相应方法 |
| Activate | 一般放置在类上,表示其是一个激活类 |
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;
ExtensionLoader loader = 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 {
@Adaptive
Invoker 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就是该规则产生
| 转换接口名 | 转换后 |
|---|---|
| AbcEfg | abc.efg |
| Protocol | protocol |
xx就是下文spi文件 的key=value 的key
dubbo spi 查找位置| 位置 | 作用 |
|---|---|
| /meta-INF/dubbo/internal | 一般dubbo内部的spi接口定义此处 |
| /meta-INF/services | 兼容jdk查找 |
| /meta-INF/dubbo | 一般应用程序spi定义于此处 |
总结dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
为什么使用dubboSPI ,dubbo spi实例化时根据URL入参决定具体实例化哪个实现类,避免jdk那样全盘实例化,提高资源响应速度,按需加载介绍spi的配置位置,配置格式介绍Adaptive注解作用于方法和类上的区别介绍Spi注解作用,标记以及默认实现类的命名



