zoukankan      html  css  js  c++  java
  • 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之间转换
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/super-admin/p/9728827.html
Copyright © 2011-2022 走看看