这是我们要测试的代码

OderDao就是我们要需要获取的对象。

首先我们根据传入的参数,进入SqlSessionFactoryBuilder 中的对应的build 方法,第一步创键XMLConfigBuilder(XML配置建造者)对象,通俗点来说就是通过建造者模式,创建与配置文件相关的一些类。 首先这个XMLConfigBuilder类是继承于BaseBuilder。

再看他本身的有参构造方法

这里他通过传入的参数不同,最终会调用自己私有的构造方法,当执行第一个构造方法时,他会创建一个XPathParser(路径解析)对象,这个对象就是用于解析我们传入的配置文件的路径信息然后解析核心配置文件,这里我们不做过多研究,主要看第二个方法中的configuration对象,在这里他自己创建了一个Configuration对象,然后传给父类,也就是上面我们说到的BaseBuilder对象的构造方法,所以,这里的this.configuration对象是我们创建好传给父类再继承父类的。然后这里调用了configuration对象本身的setVariables(props)方法 ,并把参数对象Properties传给他,那这里的Properties对象的值,或者属性是哪里来的呢?这个下面会说到,然后我们再注意第二个属性的赋值,这个属性叫做parsed,他给的值是false 也就是默认的是false。

到这里就完成了一些与配置文件相关对象的创建了。然后我们再回到build方法中进行第二步。

同样,这里第二步是调用XMLConfigBuilder对象中的parse方法,这个方法的作用就是解析我们的核心配置文件了。

进入parse方法 ,我们首先看到就是判断parsed属性值,这个属性我们在构造方法中看到了,默认的是false,所以这里不会执行if中的语句,然后我们给他赋值为true。紧接着调用parseConfiguration这个方法,至于传入的值,我们这里就看做他已经解析好了我们配置文件中Configuration中的配置,并装载到这个XNode对象中。

我们进入parseConfiguration这个方法中。我们可以看到一系列设置参数的方法,这就是将我们的核心配置文件通过不同节点名称解析出来,再装载到不同对象中的过程。这里我们重点看一下mapperElement方法

首先就是判断我们映射文件的方式,这里我以通过package实现集成动态代理的方式,进入Configuration中的addmppaers方法中,

这里是同调用MapperRegistry(映射注册表)中的一系列方法,实现映射文件的注册。到这里我们就可以回到parser()方法返回一个Configuration对象了

回到我们的build方法中,这里又调用同名不同参的build方法

这个就可以返回一个DefaultSqlSessionFactory对象了。到这里总算完成了第一个步骤,创建SqlSessionFactory对象。

下一步,我们就需要去找SqlSession对象了。

同样的我们去找openSession方法,刚才我们提到,我们调用SqlSessionFactoryBuilder的 build方法,本身返回的就是一个DefaultSqlSessionFactory对象,那我们就去找这个方法。这里我们先不了解下面的带Executor执行器的方法。

这个方法很简单,就是给我们调用openSessionFormDataSource方法,传入的Configuration对象就是我们上面已经创建好并通过解析配置文件装载好属性返回的COnfiguration对象。

这里我们提一下,如果我们没有在配置文件中设置Executor执行器的类型,他默认的是SimpleExecutor也就是普通执行器对象。然后我们接着往下看openSessionFormDataSource方法。

这里很好理解,就是调用我们的configuration对象和我们已经解析好的各中装载对象中的值对我们要返回的SqlSession对象赋初值。然后我们就得到创建好的DefaultSqlSession对象了。

然后我们去调用我们的session对象,实现动态代理。

这个方法就是我们DefaultSqlSession对象中的getMapper方法,很显然,就是通过我们的Configuration对象来返回的我们寻找的映射类。

看到这个方法是不是很熟悉呢,就跟我们上面解析配置文件中的mapper节点,通过判断package动态代理方式,然后去添加我们的映射注册表如出一辙呢。我们继续往下看。

进入MapperRegistry对象中的getMapper方法,这里根据我们传入的java实体类的类型,去MapperProxyFactory(映射代理对象工厂)顾名思义,这个对象就是加工我们映射对象实体类的地方,到这里,我们先看看注册表和映射代理对象工厂的关系。

在我们的注册表中,一个java实体类型,对应一个映射代理工厂,这也就体现了我们可以实现不同java类的代理。然后我们进入MapperProxyFactory。

既然叫工厂,他的功能当然生产,这里就是在生成一个映射代理对象,然后返回它,。然我们看看测试代码呢。

看来跟我们上面的返回对象是一样的。这样我们就真正的得到了代理对象了。

<!--这里就基于Mybatis源码简单了解获取动态代理对象的过程。欢迎大家留言,一起讨论,一起进步。有不对的地方,望大佬指教,也请大家多多包涵!-->

Mybatis-简单基于源码了解获取动态代理对象的更多相关文章

  1. mybatis源码阅读(动态代理)

    这一篇文章主要是记录Mybatis的动态代理学习成果,如果对源码感兴趣,可以看一下上篇文章  https://www.cnblogs.com/ChoviWu/p/10118051.html 阅读本篇的 ...

  2. 从Mybatis源码理解jdk动态代理默认调用invoke方法

    一.背景最近在工作之余,把开mybatis的源码看了下,决定自己手写个简单版的.实现核心的功能即可.写完之后,执行了一下,正巧在mybatis对Mapper接口的动态代理这个核心代码这边发现一个问题. ...

  3. mybatis源码学习: 动态代理的应用(慢慢改)

    动态代理概述 在学spring的时候知道使用动态代理实现aop,入门的列子:需要计算所有方法的调用时间.可以每个方法开始和结束都获取当前时间咋办呢.类似这样: long current=system. ...

  4. sping aop 源码分析(-)-- 代理对象的创建过程分析

    测试项目已上传到码云,可以下载:https://gitee.com/yangxioahui/aopdemo.git 具体如下: public interface Calc { Integer add( ...

  5. Mybatis中原生DAO实现和Mapper动态代理实现

    Mybatis开发dao的方法通常用两种,一种是传统DAO的方法,另一种是基于mapper代理的方法. 一.传统DAO方式开发 1.sql语句映射文件编写 User.xml <?xml vers ...

  6. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  7. AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象

    现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...

  8. Springboot中mybatis执行逻辑源码分析

    Springboot中mybatis执行逻辑源码分析 在上一篇springboot整合mybatis源码分析已经讲了我们的Mapper接口,userMapper是通过MapperProxy实现的一个动 ...

  9. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

随机推荐

  1. MySQL之数据的简单查询

    我直接把我的mysql学习笔记以图片的形式粘贴在这里了,供自己回顾(都是一些简单的语句)

  2. 项目Alpha冲刺Day11

    一.会议照片 二.项目进展 1.今日安排 熟悉框架的使用以及编写用户查看的界面以及该页面内的操作. 2.问题困难 全局的日期转换出现问题,在序列化的时候是按照配置来的,但是反序列化的时候就错了,问题待 ...

  3. 数字是否可以被3和5同时整除,use if and % (21.9.2017)

    #include <stdio.h> int main(){ int a; //a是所输入的数字 printf("输入数字: "); scanf("%d&qu ...

  4. 20145237 《Java程序设计》第2周学习总结

    教材学习内容总结 本周我学习了java的基础语法.分为类型.变量与运算符,流程控制. 一.类型:1.Java可以区分为基本类型和类类型.类类型也称作参考类型.2.Java中基本类型主要是整数.字节.浮 ...

  5. Java8-如何构建一个Stream

    Stream的创建方式有很多种,除了最常见的集合创建,还有其他几种方式. List转Stream List继承自Collection接口,而Collection提供了stream()方法. List& ...

  6. http客户端请求及服务端详解

    http客户端请求及服务端详解 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...

  7. 自动化服务部署(一):Linux下安装JDK

    自动化测试的主要目的是为了执行回归测试.当然,为了模拟真实的用户操作,一般都是在UAT或者生产环境进行回归测试. 为了尽量避免内网和外网解析对测试结果的影响,将自动化测试服务部署在外网的服务器是比较好 ...

  8. HTTP与私有二进制协议之间的区别

    简单的文本协议.二进制协议 写网络程序躲不过协议,协议其实就是定义了消息的格式,以及消息是如何交换的.协议可简单可复杂,复杂精密如TCP协议,简单奔放如HTTP的协议.这里将我所接触到的协议稍微总结一 ...

  9. angluarjs2入门学习资源

    http://www.runoob.com/angularjs2/angularjs2-tutorial.htmlhttps://segmentfault.com/a/1190000008423981 ...

  10. SpringCloud的应用发布(四)vmvare+linux,防火墙和selinux

    一.vmvare网络配置为nat模式 二.vmvare的网络设置为桥接bridge模式 1.linux 网卡的ip获取方式dhcp 三.关闭linux的防火墙和selinux 1.临时关闭防火墙 sy ...