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 源码的一 ...
随机推荐
- Redis --> Redis架构设计
Redis架构设计 一.前言 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列 ...
- JAVA关于一些变量的技巧
如果一个变量的值不变,而且他还要被多次用到 另建一个类,把变量定义到里面 注意 private static public class JexlConfig { private ...
- linux特殊字符及其作用
1.通配符 ? 匹配单个字符 * 代表所有字符 [abcd] 匹配[]里任意一个字符.4选1 [a-d] [!abcd] 匹配不含[]里任意一个字符的字符.[^abcd] ...
- alpha冲刺第三天
一.合照 二.项目燃尽图 三.项目进展 今天是一个瓶颈期,在昨天被困住的地方今天还是没能解决,所以今天的项目进展并没有发生什么变化. 今天晚上xl和lj去实验室找学姐了,在学姐的帮助下大概有了一点思路 ...
- initializer element is not a compile-time constant
初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值! 如下就会报这个错误(KUIScreenWidth)是变量 static CGFloat const topButtonWidt ...
- SQL的介绍及MySQL的安装
基础篇 - SQL 介绍及 MySQL 安装 SQL的介绍及MySQL的安装 课程介绍 本课程为实验楼提供的 MySQL 实验教程,所有的步骤都在实验楼在线实验环境中完成, ...
- bzoj 2962 序列操作
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...
- raid5两块硬盘离线怎么办? 强制上线失败如何恢复数据
服务器故障描述: 客户使用Dell 2850服务器组建了raid5磁盘阵列,阵列中包含有6块硬盘(SCSI硬盘,单盘容量300G),服务器操作系统为linux Redhat4:文件系统为ext3文件系 ...
- vue下拉列表
最近在弄作品,做了个下拉列表.心想各位小哥哥.小姐姐可能会用到相同的需求,就把下拉列表封装一下,希望能对各位小哥哥,小姐姐有帮助 github地址:https://github.com/ClmPisc ...
- $(function(){})和window.onload的区别
(1)$(function(){}):DOM节点创建 完成才执行 (2)window.onload:页面所有资源(JS/CSS)加载完成才执行