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()生成的代理类解析
最新文章
- instanceof运算符
- canvas初探2
- Linux更改主机名--适用于Centos
- 2014 Super Training #1 B Fix 状压DP
- Threat Risk Modeling Learning
- WordPress博客教程:博客赚钱
- 最近用到这个强大的工具 PhysicsEditor (转)
- 纯HTML页面为了避免频繁前后台Ajax交互方案
- 禁用物料不允许BOM
- windows后台服务程序编写
- C# 毛玻璃效果
- rsyslog管理分布式日志
- 201521123067 《Java程序设计》第7周学习总结
- spring security学习
- linux常用软件安装,常用命令
- [Objective-C语言教程]字符串(16)
- 无法将数据库从SINGLE_USER模式切换回MULTI_USER模式(Error 5064),及查找SQL Server数据库中用户spid(非SQL Server系统spid)的方法
- Stack Overflow 2016年度 20个最佳Python问题(一)
- Gitlab搭建安装及使用中遇到的问题。
- springcloud-Feign基础使用