Mybatis-简单基于源码了解获取动态代理对象

这是我们要测试的代码
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-简单基于源码了解获取动态代理对象的更多相关文章
- mybatis源码阅读(动态代理)
这一篇文章主要是记录Mybatis的动态代理学习成果,如果对源码感兴趣,可以看一下上篇文章 https://www.cnblogs.com/ChoviWu/p/10118051.html 阅读本篇的 ...
- 从Mybatis源码理解jdk动态代理默认调用invoke方法
一.背景最近在工作之余,把开mybatis的源码看了下,决定自己手写个简单版的.实现核心的功能即可.写完之后,执行了一下,正巧在mybatis对Mapper接口的动态代理这个核心代码这边发现一个问题. ...
- mybatis源码学习: 动态代理的应用(慢慢改)
动态代理概述 在学spring的时候知道使用动态代理实现aop,入门的列子:需要计算所有方法的调用时间.可以每个方法开始和结束都获取当前时间咋办呢.类似这样: long current=system. ...
- sping aop 源码分析(-)-- 代理对象的创建过程分析
测试项目已上传到码云,可以下载:https://gitee.com/yangxioahui/aopdemo.git 具体如下: public interface Calc { Integer add( ...
- Mybatis中原生DAO实现和Mapper动态代理实现
Mybatis开发dao的方法通常用两种,一种是传统DAO的方法,另一种是基于mapper代理的方法. 一.传统DAO方式开发 1.sql语句映射文件编写 User.xml <?xml vers ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象
现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...
- Springboot中mybatis执行逻辑源码分析
Springboot中mybatis执行逻辑源码分析 在上一篇springboot整合mybatis源码分析已经讲了我们的Mapper接口,userMapper是通过MapperProxy实现的一个动 ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
随机推荐
- 解决数据库mysql插入乱码问题
当我们遇到mysql乱码问题的时候,一般要修改my.ini文件: 我遇到的是两个版本,一个是mysql5.5版本,另一个是mysql5.7 5.5的是在这个目录下面:C:\Program Files\ ...
- 用python程序来画花
from turtle import * import time setup(600,800,0,0) speed(0) penup() seth(90) fd(340) seth(0) pendow ...
- 【Spring系列】Spring mvc整合redis(非集群)
一.在pom.xml中增加redis需要的jar包 <!--spring redis相关jar包--> <dependency> <groupId>redis.cl ...
- C语言第四次博客作业
一.PTA实验作业 题目1.梅森数 1.本题PTA提交列表(要提交列表,不是结果) 2. 设计思路(此处用流程图最好) 1.定义三个变量n,num,count,且初始化count为1 2.读取一个数n ...
- 高级软件工程2017第6次作业——团队项目:Alpha阶段综合报告
1.版本测试报告 1.1在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? Bug分类 Bug内容 Fixed 编辑博文时改变文字格式会刷新界面 Can't reproduced 无 N ...
- sql with as 用法-Z
以下内容转自:http:.com/ 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个 ...
- ResNet
 上图为单个模型 VGGNet, GoogleNet 都说明了深度对于神经网络的重要性. 文中在开始提出: 堆叠越多的层, 网络真的能学习的越好吗? 然后通过神经网络到达足够深度后出现的退化(deg ...
- python解释NTFS runlist的代码(文章转自北亚数据恢复张宇工程师)
代码如下: 执行效果如下:root@zhangyu-VirtualBox:~/NTFS-5# python3 read_runlist.py mft_source.img ***参数数量或格式错误! ...
- 一、Django的基本用法
学习Django有一段时间了,整理一下,充当笔记. MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 ...
- Microsoft Soft SQL Server 大数据----分区表性能测试
分区表 MSSQL有一个大数据储存方案,可以提高效率那就是分区表. 使用起来跟普通表没有区别.至于具体原理自己度娘吧. 真正性能的提高,是依赖于硬件的加入.也是就说,当把一个表设置成分区表,每一个分区 ...