原则:面向接口编程
①:META-INF/services/org.speed.dubbo.spi.service.RpcService
文件的名称是接口的名称,里面的内容是key-value 值
pay=org.speed.dubbo.spi.service.PayRpcService,其中key为名称,value为实现类
②:实现类中有其他接口的实例变量,可以支持自动装入 (set 方法实现注入)
③:可以基于装饰方式实现代理,支持方法调用前、后拦截功能 (通过构造方法实现包装)
④:基于 URL 传递参数,通过参数生成代理类(通过字节码运行时生成类)
⑤:通过 RpcService order = ExtensionLoader.getExtensionLoader(RpcService.class).getExtension("order");
order 为查询的具体实现类,通常情况下这个名称为动态参数
AdaptiveClassCodeGenerator自动生成代理对象
备注:自动生成的代码:
import org.apache.dubbo.common.extension.ExtensionLoader;
//通过字节码生成的类
public class Request$Adaptive implements org.speed.dubbo.spi.request.Request {
public java.lang.String sendRequest(org.apache.dubbo.common.URL arg0) {
if (arg0 == null) {
throw new IllegalArgumentException("url == null");
}
org.apache.dubbo.common.URL url = arg0;
String extName = url.getParameter("framework", "netty");
if (extName == null) {
throw new IllegalStateException(
"Failed to get extension (org.speed.dubbo.spi.request.Request) name from url (" +
url.toString() + ") use keys([framework])");
}
org.speed.dubbo.spi.request.Request extension = (org.speed.dubbo.spi.request.Request) ExtensionLoader.getExtensionLoader(org.speed.dubbo.spi.request.Request.class)
.getExtension(extName);
return extension.sendRequest(url);
}
}
网友评论