| 代理设计模式: 是java中常用的设计模式! | 
|  |  | 
|  | 例子: | 
|  | 小明找 小黑 给 小红送一朵玫瑰花! | 
|  |  | 
|  | 小明: 委托类 | 
|  | 小黑: 代理类 | 
|  | 小红也得知道 花是小明送的! | 
|  | 但是在小黑送花之前和之后对小红做什么?那就不知道! | 
|  |  | 
|  |  | 
|  | 主业务: 送花 | 
|  | 系统级业务: 小黑送花之前和之后的行为 | 
|  |  | 
|  |  | 
|  | 小黑说:"这是小明送你的玫瑰花!"; | 
|  | 小红说:"滚"! | 
|  | 小黑就愉快的飞走了! | 
|  | 然后小黑把 小红说的话 转达给小明! | 
|  |  | 
|  | 特点: | 
|  | 01.委托类和代理类有相同的接口或者共同的父类! | 
|  | 02.代理类为委托类负责处理消息,并将消息转发给委托类! | 
|  | 03.委托类和代理类对象通常存在关联关系! | 
|  | 一个代理类对象与一个委托类对象关联! | 
|  | 04.代理类本身并不是真正的实现者!而是通过调用委托类的方法, | 
|  | 来实现功能! | 
|  |  | 
|  |  | 
|  | 按照代理类创建的时机,代理类分为两种: | 
|  | 01.静态代理:由我们程序猿或者特定的工具自动生成了源代码, | 
|  | 在程序运行之前,.class文件已经存在了! | 
|  | (serviceImpl 调用了 dao层的方法! 真正的实现是Dao) | 
|  | 02.动态代理:在程序运行期间,通过反射的方式动态的创建出来! | 
|  |  | 
|  |  | 
|  | 按照我们的使用方式: 是由共同的接口还是公共的父类? | 
|  |  | 
|  | 01.jdk动态代理 (接口) | 
|  | 必须知道一个类和一个接口 | 
|  | 001.InvocationHandler接口只有一个方法 | 
|  |  | 
|  | public Object invoke(Object proxy, Method method, Object[] args) | 
|  | throws Throwable; | 
|  |  | 
|  | proxy:代理类对象 | 
|  | method:被代理的方法 | 
|  | args:被代理的方法的参数列表 | 
|  |  | 
|  | 002.Proxy 类: | 
|  | public static Object newProxyInstance(ClassLoader loader, | 
|  | Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException | 
|  | loader:类加载器 | 
|  | interfaces:代理类实现的所有接口 | 
|  | h:InvocationHandler接口的一个实例 this当前对象 | 
|  | 因为我们想使用jdk动态代理 必须是 代理类 实现 InvocationHandler! | 
|  | 它让我们传递父接口 我们传递 自身! | 
|  |  | 
|  | 02.cglib动态代理(接口+父类) | 
|  | 必须知道一个类和一个接口 | 
|  | 001.MethodInterceptor接口 | 
|  |  | 
|  | public Object intercept(Object obj, | 
|  | Method method,Object[] args,MethodProxy proxy) throws Throwable; | 
|  |  | 
|  | intercept是所有拦截器执行的方法,类似于jdk动态代理中的invoke | 
|  |  | 
|  |  | 
|  | 002. Enhancer类 | 
|  |  | 
|  | 设置委托类和代理类的公共接口或者公共的父类 | 
|  | public void setSuperclass(Class superclass) { | 
|  | if (superclass != null && superclass.isInterface()) { | 
|  | setInterfaces(new Class[]{ superclass }); | 
|  | } else if (superclass != null && superclass.equals(Object.class)) { | 
|  | // affects choice of ClassLoader | 
|  | this.superclass = null; | 
|  | } else { | 
|  | this.superclass = superclass; | 
|  | } | 
|  | } | 
|  |  | 
|  | 代理类执行完毕 通知委托类 | 
|  | public void setCallback(final Callback callback) { | 
|  | setCallbacks(new Callback[]{ callback }); | 
|  | } | 
|  |  | 
|  |  | 
|  | 在Enhancer类的父类AbstractClassGenerator中有一个方法 | 
|  | 创建我们需要的代理类 | 
|  | protected Object create(Object key) |