• zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理


    CGLIB与JDK动态代理区别

    区别:
    java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
    1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
    2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
    3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

    代理模式

    什么是代理?

    通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现)  ,AOP核心技术面向切面编程。

    http://my.csdn.net/uploads/201205/08/1336453143_5004.png

     

    代理应用场景

    安全代理 可以屏蔽真实角色

    远程代理 远程调用代理类RMI

    延迟加载 先加载轻量级代理类,真正需要在加载真实

    代理的分类

    静态代理(静态定义代理类)

    动态代理(动态生成代理类)

    Jdk自带动态代理

    Cglib 、javaassist(字节码操作库)

    静态代理

    静态代理需要自己生成代理类

    public class XiaoMing implements Hose {

         @Override

         public void mai() {

             System.out.println("我是小明,我要买房啦!!!!haha ");

         }

    }

    class Proxy  implements Hose {

         private XiaoMing xiaoMing;

         public Proxy(XiaoMing xiaoMing) {

             this.xiaoMing = xiaoMing;

         }

         public void mai() {

             System.out.println("我是中介 看你买房开始啦!");

             xiaoMing.mai();

             System.out.println("我是中介 看你买房结束啦!");

         }

         public static void main(String[] args) {

             Hose proxy = new Proxy(new XiaoMing());

             proxy.mai();

         }

    }

     

    JDK动态代理(不需要生成代理类)

    实现InvocationHandler 就可以了。

    public interface Hose {

     

        /**

         *

         * @methodDesc: 功能描述:(买房代理)

         * @author: 余胜军

         * @param:

         * @createTime:2017年8月27日 上午2:54:34

         * @returnType: void

         * @copyright:上海每特教育科技有限公司

         */

        public void mai();

     

    }

     

     

    public class XiaoMing implements Hose {

     

        @Override

        public void mai() {

            System.out.println("我是小明,我要买房啦!!!!haha ");

        }

     

    }

     

    public class JDKProxy implements InvocationHandler {

        private Object tarjet;

     

        public JDKProxy(Object tarjet) {

            this.tarjet = tarjet;

        }

     

        @Override

        public Object invoke(Object proxy, Method method, Object[] argsthrows Throwable {

            System.out.println("我是房产中介.....开始监听你买房啦!");

            Object oj = method.invoke(tarjetargs);

            System.out.println("我是房产中介.....结束监听你买房啦!");

            return oj;

     

        }

     

    }

     

    class Test222 {

        public static void main(String[] args) {

            XiaoMing xiaoMing = new XiaoMing();

            JDKProxy jdkProxy = new JDKProxy(xiaoMing);

            Hose hose=(Hose) Proxy.newProxyInstance(xiaoMing.getClass().getClassLoader(), xiaoMing.getClass().getInterfaces(), jdkProxy);

            hose.mai();

        }

     

    }

     

    CGLIB动态代理

    实现

     

    import java.lang.reflect.Method;

     

    import net.sf.cglib.proxy.Enhancer;

    import net.sf.cglib.proxy.MethodInterceptor;

    import net.sf.cglib.proxy.MethodProxy;

     

    public class Cglib implements MethodInterceptor {

     

         @Override

         public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxythrows Throwable {

             System.out.println("我是买房中介  开始监听你买房了....");

             Object invokeSuper = methodProxy.invokeSuper(oargs);

             System.out.println("我是买房中介  开结束你买房了....");

             return invokeSuper;

     

         }

     

    }

     

    class Test22222 {

         public static void main(String[] args) {

             Cglib cglib = new Cglib();

             Enhancer enhancer = new Enhancer();

             enhancer.setSuperclass(XiaoMing.class);

             enhancer.setCallback(cglib);

             Hose hose = (Hose) enhancer.create();

             hose.mai();

         }

    }

     

     

    CGLIB与JDK动态代理区别

    区别:
    java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
    1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
    2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
    3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
  • 相关阅读:
    20155303 实验五 网络编程与安全
    20155303 2016-2017-2 《Java程序设计》课程总结
    20155303 实验四 Android程序设计
    《Java 程序设计》课堂实践项目 课后学习总结
    20155303 实验三 敏捷开发与XP实践
    20155303 2016-2017-2 《Java程序设计》第十周学习总结
    Java第七次作业--图形用户界面
    Java第六次作业--异常处理和Java类集
    Java第五次作业--面向对象高级特性(抽象类和接口)
    Java第四次作业--面向对象高级特性(继承和多态)
  • 原文地址:https://www.cnblogs.com/super-admin/p/9728827.html
Copyright © 2020-2023  润新知