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()生成的代理类解析

posted @ 2019-07-21 21:26  賣贾笔的小男孩  阅读(228)  评论(0编辑  收藏  举报