| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> MyBatis Mapper JDK动态代理方式源码分析 -> 正文阅读 |
|
[Java知识库]MyBatis Mapper JDK动态代理方式源码分析 |
上篇文章从JDBC优化开始,对Mybatis传统xml配置主线流程源码剖析,这里不多对JDBC,xml配置的框架源码做多的分析,直接看源码: 还是从框架的启动入口着手,SqlSession接口的解析,在上篇文章中有提到这里不多赘述。 通常情况,UserMapper我们并没有对其进行接口的实现,在接口的声明时通过@Mapper配置或XML配置Mapper接口路径去暴露接口位置信息。 接口中包含的一些Mybatis框架自己封装的数据库操作方法或是映射xml中配置的方法,它们是怎样被调用的?可以肯定的是通过了接口路径去做了动态的加载,而方法的调用则是通过了动态代理的方式去执行。
getMapper解析上面说到了UserMapper接口的加载,是怎样去加载的?直接点进getMapper方法去查看。进入到SqlSession接口中的getMapper方法,有两个实现类?DefaultSqlSession &?SqlSessionManager。?
这里不用多去分析具体去查阅哪一个,他们中的实现方法都会跳转到Configuration类中getMapper方法中去
然后看一下MapperRegistry类,上一篇文章中有说到过Configure类,它里面存放了Mybatis读取的配置信息,XML中解析出来的MapperStatement对象,解析拼接而成的sql....,这里的源码中可以发现MapperRegistry是用来做了一个配置的传递对象,有点类似工厂类去做的事情。 ?MapperRegistry的对象实例化后,调用了它的getMapper方法。然后会发现它去获取了一个MapperProxyFactory对象。
不急着往下看,先看knownMappers这个属性中是如何存入值的,这里就需要一步一步的倒放去看。knownMappers是定义的一个MapperProxyFactory的存放容器。既然是容器那么肯定有一个存入容器的方法提供,在这个类中往下翻。 ?果然发现了一个addMapper的方法,去往容器中注值。前面的判断就是判断传过来的这类是不是一个接口然后就开始放入,然后对一些注解进行了解析,解析的无非就是Mapper接口中不想去配置XML去加了@Select等等一些sql直接暴露的注解,这里不多深挖,去看这个addMapper方法被谁调用了! ?然后继续的去倒着查,发现又回到了Configure对象中去了...,还是老一套的Configure对象中调用Resiger对象方法,然后继续的倒追,然后到了Mybatis框架启动build类中的mapperElement方法,这个里的MapperClass我用红箭头标记了,是解析xml中获取的Mapper接口的路径信息,既然到这里了,回顾下Mapper接口的配置吧?,直接贴配置,配置不做多的分析。到了这里就跟我前面说的吻合了,通过配置的类的路径去动态加载这个类的实例。
回到上面的MapperProxyFactory,这里就是重点了,拿到这个类后下面调用了它的newInstance方法,从命名上来看应该是实例化,刚刚一路跟踪过来也看了,拿到的只是一个Class对象并没有进行实例化的Mapper.class。 点进去到MapperProxyFactory的newInstance方法,先从这个类的初始化方法说起,之前knownMappers方法去实例化MapperFactory对象传入的Mapper.class通过初始化方法赋值属性mapperInterface,而methodCache则是用来存放mapper的方法的容器。参数解释完,然后去看MapperProxy方法。
MapperProxy对象实现了InvocationHandler接口,去做JDK动态代理,JDK动态代理这里不做多的顶层赘述,简要说一下,JDK动态代理返回了示例后,可以直接调用mapper类中的方法了,但代理对象不管调用什么方法,在调方法时,执行的是 在MapperProxy中的invoke方法中,这也是AOP面向切面编程的重要方式之一。 贴出invoke方法,?Proxy是动态代理对象,method是你调用的动态代理的方法,args则是你传入的参数,等同Object ... params 的写法。点进去看execute方法,然后发现到这里之后,则开始执行Sql的处理基本操作了,然后返回Sql执行的对象。?然后就是方法执行中做了很多的反射判断,对方法是不是存在啊,参数是不是对应的上啊之类的判断然后返回异常给开发人员等等操作,不做多的赘述。
? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 7:50:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |