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 源码的一 ...
随机推荐
- 解决图片裁剪com.android.camera.action.CROP和intent.putExtra("return-data", true);
最近在做一个图片上传,在上传之前需要对照片进行裁剪,遇到一个坑,在别的手机上运行都正常,在小米手机上却遇见一个问题,选中图片无法裁剪,直接闪退,目前已解决!之前出过问题的地方会标红 //选择图片 pr ...
- JavaOOP-集合框架
1.Java集合框架包含的内容 Java集合框架为我们提供了一套性能优良,使用方便的接口和类,它们都位于在java.util包中. Collection 接口存储一组不唯一,无序的对象. List 接 ...
- Linux环境下Swap配置方法
Linux环境下Swap配置方法 场景: 今天下午安装一个CentOS6.5操作系统,忘记配置swap分区.看看如何安装系统之后,增加和删除swap分区.方法如下:1.内存占用情况[root@josh ...
- JavaScript 通过队列实现异步流控制
知乎上面看到一个面试题. 某个应用模块由文本框 input,以及按钮 A,按钮 B 组成.点击按钮 A,会向地址 urlA 发出一个 ajax 请求,并将返回的字符串填充到 input 中(覆盖 in ...
- RTMP规范协议
本文参照rtmp协议英文版,进行简单的协议分析 1.什么是RTMP 关于 Adobe 的实时消息协议(Real Time Messaging Protocol,RTMP),是一种多媒体的复用和分组的应 ...
- 2018.3.29 DIV位置调整代码
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- Alpha第三天
Alpha第三天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- C语言博客作业--数据类型
一.PTA实验作业 题目1:7-8 判断合法标识符 1. 本题PTA提交列表 2. 设计思路 1.定义整数型变量repeat和i来存放判断字符串是否为合法标识符的次数,定义字符型ch来存放读取的字符 ...
- 基于微信小程序的失物招领系统的Postmortem
基于微信小程序的失物招领系统的Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 对于我们团队要解决的问题和实现的功能在项目开始就 ...
- 201621123031 《Java程序设计》第7周学习总结
作业07-Java GUI编程 1.本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 事件监听器: Java事件监听器是由事件类和监听接口组成,自定义 ...