zoukankan      html  css  js  c++  java
  • 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();
        }
    }

        未完待续!!!

          

  • 相关阅读:
    01-Django 简介
    函数及函数的嵌套等
    循环及循环嵌套
    运算符
    if, elif, else及if嵌套
    变量及变量计算和引用
    Python的3种执行方式
    Jmeter设置默认中文启动
    Vysor
    python基础学习(二)
  • 原文地址:https://www.cnblogs.com/fl72/p/9641864.html
Copyright © 2011-2022 走看看