##查看代码:https://gitee.com/jly521/proxy.git
代理模式(Proxy)
- 应用场景:为其他对象提供一种代理以控制对这个对象的访问
- 从结构上来看和Decorator 模式类似,
- 但Proxy 是控制,更像是一种对功能的限制,而Decorator 是增加职责
- Spring 的Proxy 模式在AOP 中有体现,比如JdkDynamicAopProxy 和Cglib2AopProxy(就是 JDK动态代理和 CGLIB 动态代理)
- 静态代理和动态代理
静态代理::
- 就是把被代理对象包起来,任何人要访问被代理对象,就来找我,我是全权代理
动态代理::
- jdk 动态代理 和 cglib 动态代理
自己动手实现一个 动态代理::
调用方法:
- 传入被具体的代理类(返回结果是被代理类实现的接口)
CustomMeipo 具体实现
- 继承 GPInvocationHandler 调用钩子接口
- 把引用保存起来
- 生成实例
- 注意,此处的实例其实是被代理类的封装子类,从实现原理中我们会知道该子类是动态生成的
- 传入参数 GPInvocationHandler 是调用钩子(本类继承了该接口,钩子可以传自己)
- 实现 钩子接口方法,增强被代理类的方法实现
基本原理:
- 具体实现有:类 GPProxy、GPInvocationHandler 接口、GPClassLoader 类
GPInvocationHandler 接口
- 回调钩子接口
- 提供方法调取钩子方法,用于客户增强方法功能
GPClassLoader::
- GPClassLoader 继承 ClassLoader
- 用于编译生成的临时文件 $Proxy0.java 获得$Proxy0.class,加载到JVM中来
GPProxy::
- 主实现类,生成一个新的实例,即被实现类的 增强实例(生成的这个类很像静态代理类,不过此处是动态生成的)
- 动态生成源代码.java文件 $Proxy0.java(在GPProxy 相同目录下)
- Java文件输出磁盘
- 把生成的.java文件编译成.class文件(删除.java文件)
- 编译生成的.class文件加载到JVM中来
- 返回字节码重组以后的新的代理对象(传入回调钩子)