自己设计一个的轻量级的RPC框架--客户端Spring工厂Bean
2019-03-05 09:27
246 查看
自己设计一个的轻量级的RPC框架--客户端Spring工厂Bean和动态代理
前言
上篇博客讲到实现自定义bean,其实那边注入的bean是一个工厂Bean。这篇主要就是来讲解如何定义一个bean,并且通过jdk的动态代理来实现对消费接口的代理。
为什么要用FactoryBean接口
首先这个一个消费接口
@RPCClient public interface clientWorld { @RPCURL(className="serverWorld2",methodName="message") public List message(String world); }
这个是在controller中调用
@Controller @RequestMapping("/clientWorld") public class clientWorldController { @Autowired private clientWorld clientWorld; @RequestMapping("sendMessage") @ResponseBody public List sendMessage(String message){ return clientWorld.message(message); } }
很明显并有没clientWorld 这个接口的实现类,其实是我在上篇讲过的我这边获取到的clientWorld 对象其实是一个代理对象。那我不可能一个接口编写一个对象的代理对象,所以这里我就需要一个工厂Bean让它来帮我们完成创建。
使用FactoryBean接口
通过传人接口对象 我们通过动态代理返回一个代理对象这样就能够灵活的实现我们的需求。
public class MethodProxyFactory<T> implements FactoryBean<T>{ private Class<T> interfaceClass;//所对应的消费接口 public Class<T> getInterfaceClass() { return interfaceClass; } public void setInterfaceClass(Class<T> interfaceClass) { this.interfaceClass = interfaceClass; } @Override public T getObject() throws Exception { return (T) newInstance(interfaceClass);//通过对应的消费接口返回代理类 } @Override public Class<?> getObjectType() { return interfaceClass; } @Override public boolean isSingleton() { return true; } @SuppressWarnings("unchecked") public static <T> T newInstance(Class<T> methodInterface) { final RPCProxyHandler<T> methodProxy = new RPCProxyHandler<T>(); return (T) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), new Class[]{methodInterface}, methodProxy); } }
简单介绍jdk动态代理
Proxy类
常用创建代理对象方法
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载 interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了 h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
InvocationHandler 接口
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable proxy: 指代我们所代理的那个真实对象 method: 指代的是我们所要调用真实对象的某个方法的Method对象 args: 指代的是调用真实对象某个方法时接受的参数
那就很简单了 只要我们在invoke()方法中调用自己的业务就能满足我们的业务需求,例如我这边是需要通过netty去请求服务获取数据并返回。这里具体的业务后面再详细讲解。
梳理一下
相关文章推荐
- 自己设计一个的轻量级的RPC框架--客户端netty
- 从0开始写一个基于注解的轻量级分布式RPC框架(4)自定义Spring的IOC,自定义属性注入bean的过程
- 自己设计一个的轻量级的RPC框架--服务手动降级
- 从0开始写一个基于注解的轻量级分布式RPC框架(3)让Spring加载自定义注解
- 通过 Spring + Netty + Protostuff + ZooKeeper 实现了一个轻量级 RPC 框架
- 通过 Spring + Netty + Protostuff + ZooKeeper 实现了一个轻量级 RPC 框架
- 如何写一个RPC框架(二):利用Bean容器和动态代理简化客户端代码
- 如何自己设计一个类似 Dubbo 的 RPC 框架?
- 一个轻量级分布式RPC框架--NettyRpc(六)
- 自己最初设计的框架--struts,spring 图
- 一个RPC服务客户端代理中间件的设计过程的回顾
- 一个自己实现的rpc框架
- Spring入门学习——调用一个实例工厂方法创建Bean
- 客户端websocket(c#)长连接及简易rpc框架设计(二)
- 一个.net客户端通讯框架的设计(四)---协议解码/编码器工厂以及为其他模块提供消息的dealers/trigers
- 为什么说Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架?
- 轻量级分布式 RPC 框架(netty-Protostuff-ZooKeeper-spring)
- SilverLight企业应用框架设计【五】客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务)
- 实现一个简易的IoC框架(上)(此篇与Spring.NET无关,为自己手写IoC框架)
- 简单分享一个轻量级自动化测试框架目录结构设计