zoukankan      html  css  js  c++  java
  • MyBatis源码分析(七):动态代理(Mybatis核心机制)

    一、动态代理

    动态代理是一种比较高级的代理模式,它的典型应用就是Spring AOP。

    在传统的动态代理模式中,客户端通过ProxySubject调用RealSubject类的request( )方法,同时还在代理类中封装了其他的方法,如preRequest( )和postRequest( ),来处理一些问题。如果按照这种方法使用代理模式,那么真实主题角色必须是实现已经存在的,并将其作为代理对象的内部成员属性。如果一个真实主题角色必须对应着一个代理主题角色,这将导致系统内类的个数急剧增加,因此需要减少系统中类的个数。

    如何在事先不知道真是主题角色的情况下使用代理主题角色,这都是动态代理需要解决的问题。

    Java动态代理实现相关类位于java.lang.reflect包,主要涉及两个类:InvocationHandler 接口 和 Proxy 类

    InvocationHandler 接口,是代理实例的调用处理程序实现的接口

    1 public Object invoke(Object proxy, Method method, Object[] args)
    2         throws Throwable;

    invoke方法第一个参数 proxy 表示代理类,第二个参数 method 代表需要代理的方法,第三个参数 args 表示代理方法的参数数组

    Proxy 类,动态代理类,常用的方法

    1 public static Object newProxyInstance(ClassLoader loader,
    2                                           Class<?>[] interfaces,
    3                                           InvocationHandler h)

    newProxyInstance方法根据传入的接口类型interfaces返回一个动态创建的代理类实例。第一个参数 loader 代表代理类的类加载器,第二个参数 interfaces 表示代理类实现的的接口类列表,第三个参数 h 表示所指派的调用处理程序类。

    二、绑定Mapper的配置

    org.apache.ibatis.binding下关系,首先调用SqlSession的getMapper方法获取mapper的代理,getMapper方法在调用Configuration的getMapper方法,这是使用到MapperRegister,接下来的关系如如所示。

    三、生成的具体Mapper代理类解析

    参考:探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析

  • 相关阅读:
    HIVE优化学习笔记
    HIVE执行引擎TEZ学习以及实际使用
    端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手四次挥手,滑动窗口(整理转发)
    kafka时间轮简易实现(二)
    kafka时间轮的原理(一)
    JAVA之G1垃圾回收器
    JAVA之垃圾收集器
    JAVA之内存结构
    SparkSQL学习笔记
    Python 学习 --简单购物车程序
  • 原文地址:https://www.cnblogs.com/magic-sea/p/11222818.html
Copyright © 2011-2022 走看看