这是我们要测试的代码

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. C++迭代器的使用和操作总结

    迭代器是一种检查容器内元素并遍历元素的数据类型.C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访 ...

  2. java日期格式大全 format SimpleDateFormat

    http://www.cnblogs.com/loveyakamoz/archive/2011/08/18/2145047.html

  3. 使用listview空控件展示数据

    1.使用listview控件可以一次性的将有关的全部图像保存在控件中,建立集合图像. 图像列表控件的主要属性 属性                                           ...

  4. 假设检验(Hypothesis Testing)

    假设检验(Hypothesis Testing) 1. 什么是假设检验呢? 假设检验又称为统计假设检验,是数理统计中根据一定假设条件由样本推断总体的一种方法. 什么意思呢,举个生活中的例子:买橘子(借 ...

  5. Redis——主从同步原理

    刚接触到Redis,首先对Redis有一个初步的了解. 开源,免费,遵守BSD协议,key-value数据库. 可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用. 多种key-value类型 ...

  6. JavaScript(第二十天)【DOM操作表格及样式】

    DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本章主要了解一下DOM操作表格和样式的一些知识. 一.操作表格 <table& ...

  7. 听翁恺老师mooc笔记(1)--为何选择学习C

    知识点1:众多编程语言,为何选择C? 现在我们的同学喜欢java,也参加很多java的培训班,java是比较热门,但是C语言在工业界依然有重要的地位,在很多领域无可替代,几乎所有和硬件打交道的地方都得 ...

  8. C语言第六次博客作业--数据类型

    一.PTA实验作业 题目1:区位码输入法 1. 本题PTA提交列表 2. 设计思路 (1)定义整型变量code放区位码,areacode放区码,digitcode放位码,one放个位数,two放十位数 ...

  9. Beta版本展示博客

    1 团队介绍 团队组成: 齐爽爽(258)个人博客:http://www.cnblogs.com/shuangshuangblog/ 马帅(248)个人博客:http://www.cnblogs.co ...

  10. 冲刺NO.5

    Alpha冲刺第五天 站立式会议 项目进展 今日项目完成内容主要包括了JS的学习,事务管理员模块与学生模块的完善与补充,并且开始编写信用信息管理模块和奖惩事务管理模块. 问题困难 前端部分的技术掌握的 ...