美文网首页
代理模式

代理模式

作者: high_m | 来源:发表于2017-11-15 16:13 被阅读0次

    代理模式一般分为两种,即静态代理和动态代理,静态代理限制比较严格,代理类和委托类必须实现相同的接口;而动态代理则更加灵活,除了jdk的动态代理,其他的代理方式,如cglib和javassist则没有此限制。Hibernate框架加载用户信息时有用到cglib动态代理模式,只有在真正查询用户实体信息(如姓名)时,才去数据库查询;获取用户实体时,返回的其实是真实实体的一个子类代理而已。

    静态代理

    静态代理类图

    一般来讲,代理模式可以用在延迟加载,有效提升系统的启动速度。


    动态代理

    动态代理流程图

    JDK动态代理

    jdk动态代理主要原理与静态代理基本一致,不过更加灵活,一般涉及到的核心接口或类为InvocationHandlerProxy,使用方式及实现原理在参考1中有较为详细的解释。

    特别是为什么代理类会执行方法时会调用处理分发器** InvocationHandler的invoke方法的分析特别到位。**

    cglib动态代理

    cglib动态代理,不用限制代理类和委托类实现相同的接口,它的基本使用在参考2中有详细的说明。

    核心示例代码如下:

    //cglib生成动态代理
    Enhancer enhancer = new Enhancer();
    enhancer.setCallback(new CgLibDBQueryInterceptor()); //指定切入器,一个实现MethodInterceptor接口的类
    enhancer.setInterfaces(new Class[]{IDBQuery.class}); //指定实现的接口
    //enhancer.setSuperclass();指定实现的父类
    //生成代理类的实例(没有接口限制,此处只不过恰好是接口而已,如果是普通类,则代理类实质上是普通类的子类)
    IDBQuery cglibProxy = (IDBQuery) enhancer.create(); //生成代理类实例
    

    参考

    1 Java JDK 动态代理(AOP)使用及实现原理分析
    2 AOP的底层实现-CGLIB动态代理和JDK动态代理
    3 Java动态代理机制详解

    相关文章

      网友评论

          本文标题:代理模式

          本文链接:https://www.haomeiwen.com/subject/gxwzmxtx.html