开篇
在Dubbo官方文档中关于泛化调用和泛化实现的说明,这里针对文档的案例做一些简单的说明和解释。
例子
// 引用远程服务
// 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存
ReferenceConfig reference = new ReferenceConfig();
reference.setApplication(new ApplicationConfig("dubbo-demo-api-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
// 弱类型接口名
reference.setInterface("org.apache.dubbo.demo.DemoService");
// 声明为泛化接口
reference.setGeneric("true");
// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
GenericService genericService = reference.get();
// 基本类型以及Date,List,Map等不需要转换,直接调用
Object result = genericService.$invoke("sayHello",
new String[] {"java.lang.String"}, new Object[] {"12345678"});
System.out.println(result.toString());
例子在注释中已经注明了泛化引用的一般步骤,这里不再赘述。
核心的本质在于reference.get()的流程获取了consumer的对象,等同于xml通过reference初始化consumer的bean对象。
本质上解析生成consumer的bean对象的过程就是泛化过程中reference.get()的过程。
泛化调用唯一需要注意的是对参数的一些限制,基本上参数不需要转换,Class对象等参数需要把保存Class对象的完整类名。
序列化说明
public class Person {
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
代码例子-------------
public class Demo {
public static void main(String[] args) {
Person person = new Person();
person.setName("person");
person.setAge(123);
System.out.println("序列化后对象:");
System.out.println(JSON.toJSONString(PojoUtils.generalize(person)));
System.out.println("反序列化后对象:");
System.out.println(JSON.toJSONString(PojoUtils.realize(PojoUtils.generalize(person), Person.class)));
}
}
运行结果-----------------
序列化后对象:
{"name":"person","class":"org.apache.dubbo.demo.consumer.Person","age