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

2018-09-18 06:35:50来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

代理设计模式

 

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();
    }
}

 

    未完待续!!!

 

      

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:【MAC】安装神器brew

下一篇:最课程阶段大作业05:污水处理系统以及百度地图