Spring(八)-- 代理设计模式

代理设计模式

1:基本概念

2JDK动态代理  

  1. 创建接口

  

  2. 创建实现类

 

  3. 创建代理类

/**
 * jdk动态代理  不能满足 继承父类的情况
 *
 * AnimalProxy  代理类
 */
public class AnimalProxy  implements InvocationHandler{

    /**
     * 这里绝对不能使用Dog! 因为我们压根不知道谁是委托类
     */
    private  Object object;

    /**
     * 给我传递一个委托类,我们返回一个代理类
     */
    public  Object  createProxy(Object  target){
        this.object=target; //传递dog  委托类就是dog  传递什么 委托类是什么
      return  Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }


    /**
     *  代理类给委托类 工作的方法
     *  给 主业务增强
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("====洗洗手====");
        Object result= method.invoke(object,args); //有返回值 使用变量接收
        System.out.println("====再次洗洗手====");
        return result;
    }


    //测试代码
    public static void main(String[] args) {
        AnimalProxy proxy=new AnimalProxy();
         Animal dog= (Animal) proxy.createProxy(new Dog());
         dog.eat();
        System.out.println("*********************");
        dog.sleep();
    }
}

   问题:

如果我们上诉案例中的Animal改成了 抽象类,

Dog改成了继承Animal,那么测试代码将会出现错误!

因为JDK动态代理 只支持接口!那么我们就使用CGLIB动态代理!

3CGLIB动态代理

/**
 * CglibProxy 代理类   (接口 + 类)
 */
public class CglibProxy  implements MethodInterceptor {

    private Enhancer enhancer=new Enhancer();

    /**
     * 创建代理类对象
     */
    public Object createProxy(Class clazz){
        //设置公共的接口或者父类
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return  enhancer.create();
    }



    /**
     * 代理类执行 委托类的 方法
     * 系统级业务进行增强
     */
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("====洗洗手====");
        Object result= methodProxy.invokeSuper(o,args);
        System.out.println("====再次洗洗手====");
        return result;
    }

    //测试代码
    public static void main(String[] args) {
        CglibProxy proxy=new CglibProxy();
        Animal dog= (Animal) proxy.createProxy(new Dog().getClass());
        dog.eat();
        System.out.println("*********************");
        dog.sleep();
    }
}

    未完待续!!!

      

原文地址:https://www.cnblogs.com/fl72/p/9641864.html