前言

这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客

http://www.cnblogs.com/linkstar/category/1027239.html

终于算是把装备弄齐全了。接下来就一步步看看MyBatis是如何工作的。

那么我们学习组件的时候就知道了,首先需要构建一个工厂。

那么我们今天就来看看这个工厂是如何建造出来的。

建造工厂大致步骤

我们先从外部的我们第一次使用MyBatis的代码开始看看工厂是如何建造的。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

1、我们需要一个配置文件 mybatis-config.xml

2、利用一个叫Resources的类的getResourceAsStream方法从xml文件中获取里面的内容

3、然后用SqlSessionFactoryBuilder也就是之前说的工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂

建造工厂的内部过程

从大致步骤我们看起来好像很容易的样子。但是实际其实复杂的很呢。

我们慢慢来分析。

1、首先我们可以确定的是,MyBatis建造工厂的时候肯定从我们配置的xml中获取了相应的配置信息,然后就能构建出我们想要的工厂了。(只有我们想要的工厂才能生产出我们想要的产品嘛)

2、前面两个步骤就我们知道就是把我们的资源给转换成一个InputStream(可能建造者就认识这样的配置信息吧)

3、那么我们的重点目标就应该放在SqlSessionFactoryBuilder的build方法上面咯,那么走,我们进源码。(如果你是一步步跟前面的博客来的话,那么源码应该点一下就进去了。。。)

其中我们看到了,建造之前需要对xml的资源进行读取。将我们的配置资源转换成了一个XMLConfigBuilder类。

这个类可想而知就是为了解析XML而生的一个类。

具体XML的解析我肯定就不仔仔细细讲了,因为解析XML的方式很多。我们就看看MyBatis解析XML需要那些XML里面的东西咯。

我们进入parser.parse()的parse方法。

然后我们注意一下,这个parse方法的返回值,Configuration

也就是说MyBatis把读取到的数据保存到了一个Configuration类中。

跟上节奏哦!!!

然后我们回到上一张图中的最下方的build方法

也就是

public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}可以看见入参就是Configuration如果你有兴趣那么可以直接进入Configuration类里面去看看。里面就是各种各样的配置信息了。当然我们关注的点不在这里,所以就不仔细看那些配置了。

 

我们的重点在这里的返回值是一个SqlSessionFactory工厂。但是看最后new的对象是DefaultSqlSessionFactory看名字我们知道是一个叫做默认的工厂。那么我们重点就是在这里,这个默认工厂怎么就造起来了呢?

 

默认工厂、DefaultSqlSessionFactory的构建

首先我们进入DefaultSqlSessionFactory这个类里面去看看。

一进去我就看到了这个这里我们可以看出两个点:SqlSessionFactory在MyBatis中是一个接口而不是一个类,DefaultSqlSessionFactory实现了这个接口。DefaultSqlSessionFactory这个类不是很长,我们来看看里面的方法,最后再来看看构造方法。

如果你仔细看看,就会发现上面生产产品的方法都是调用的最后的openSessionFromDataSource

openSessionFromConnection这两个方法。里面到底干啥了呢?其实从入参和出参我们可以看出。(两个方法类似,我就挑一个来讲)根据执行类型,事务隔离性,是否自动提交来创建DefaultSqlSession因为我们最后的产品是要执行sql语句的,所以我们的产品也就是会话里面会带有很多的执行参数,到底这个产品要做成什么样。

这里我们需要有一些觉悟,源码里代码规范还是不错的,你看,一个在之后的不会被改变的变量就用了final进行了修饰,如果你来写会这样写吗?这里只是生产产品而已,对于产品的执行我们会在之后细讲。之后我们就来看看这个构造方法;其实构造方法贼简单,就是单纯的赋值了一下,你以为有多难??public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;
}

 

产品的生产

最后我们来看看产品的生产,为之后的产品的执行做个准备。

首先进入return new DefaultSqlSession(configuration, executor, autoCommit);

我们可以看到,也是很简单的一个构造方法,也是设置了必要的参数主要我们先来大致浏览一下这个类

可以看见,SqlSession也是一个接口,而我们的默认产品是实现了这个接口。我们看看这个接口有哪些方法其实就很明了了由于方法很多,我就不展示全部了。

从方法名字是不是就很熟悉了,就是执行sql语句的方法嘛。所以我们的产品原来就是这样的。

 

总结

最后总结一下:其实工厂的构建其实还算是简单的,我们需要注意的点是,构建过程中,读取了xml配置,把配置加载加载进了类里面,而且配置的读取是有一个顺序的。

配置的不同导致了最后工厂建立的不同,导致了最后生产的产品不同。

所有真正的工厂和产品都是接口,而使用的都是默认工厂和默认产品,去实现了这些接口,一般情况下我们不可能自己去实现这些接口然后去开发的。

最后依然留下几个问题:

1、为什么MyBatis要这样设计?为什么要设计成工厂这样的模式呢?有什么样的好处?

2、接口在这里的好处是什么?

3、Configuration这个类的作用是什么?仅仅是保存和提供配置信息吗?

 

转载请注明出处:http://www.cnblogs.com/linkstar/category/1027239.html

作者:LinkinStar

MyBatis源码解析【5】工厂的构建的更多相关文章

  1. MyBatis源码解析【2】构建项目

    有了之前的准备,今天就要开始构建学习使用的项目了.废话不多说.开始吧. 首先我用IDEA构建了一个空的maven项目,然后加入了Mybatis的依赖. <dependencies> < ...

  2. Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例

    在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...

  3. Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了

    这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...

  4. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  5. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

  6. Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码

    在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...

  7. Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取

    在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们提到了两个问题: 1,为什么在以前的代码流程中从来没有addMapper,而这里却有getMapper? 2,UserDao ...

  8. Mybatis源码解析(一) —— mybatis与Spring是如何整合的?

    Mybatis源码解析(一) -- mybatis与Spring是如何整合的?   从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...

  9. Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?

    Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的?   如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一 ...

  10. Mybatis源码解析(三) —— Mapper代理类的生成

    Mybatis源码解析(三) -- Mapper代理类的生成   在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...

随机推荐

  1. jQuery使用记录

    jQuery方法获得的集合为类数组对象,可以用一些数组的方法.集合里面的元素为DOM元素,不是jQuery对象. jQuery设置css3属性的兼容性写法: $(element).css({ &quo ...

  2. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

  3. 【Netty】codec框架

    一.前言 前面已经学习完了Netty框架中的主要组件,接着学习codec框架. 二.codec框架 每个网络应用程序必须定义如何将在对等体之间传输的原始字节解析并转换为目标程序的数据格式,这种转换逻辑 ...

  4. Centos7 最小系统安装Redis

    最近想写一个调度系统,一顿查资料之后决定用Django+Celery+Redis实现,前面两个都已经有了,就缺一个Redis,所以准备安装一个Redis 获取Centos7并配置网络 获取Centos ...

  5. Ionic进行PC端Web开发时通过脚本压缩提高第一次加载效率

    1. 问题 1.1. 问题上下文描述: 基于Ionic进行PC端的Web应用开发: 使用Tomcat作为最终服务发布容器. 1.2. 问题描述: 编译后main.js的大小为4-6MByte.(集成第 ...

  6. MySQL开放远程登录

    在服务器上部署MYSQL每次观看MYSQL记录或者修改的时候都需要登录服务器,又烦又占资源.所以使用另一种方法:对外开放接口. 注:如果某些服务器开启防火墙屏蔽了某些接口就有可能导致远程用户无法登录M ...

  7. PHP cURL的详细使用手册

    PHP cURL的详细使用手册 PHP cURL可以帮助我们简单有效地去抓取网页内容,帮助我们方便的实现抓取功能.本文主要介绍了PHP cURL的使用方法. AD:2013云计算架构师峰会课程资料下载 ...

  8. Eclipse中常用的快捷键,敏捷开发必备.

    1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...

  9. 一天搞定CSS:支持IE的Layout布局--16

    1.BFC和Layout区别: BFC和Layout的作用是一样的,只是对浏览器的支持不同而已. BFC- -标准浏览器所具有的 Layout- -IE浏览器所具有的 BFC详解地址:http://b ...

  10. 主存与Cache的地址映射

    最近在复习计算机体系结构,选用的教材是名闻遐迩的<计算机体系结构 量化研究方法 第五版>(Computer Architecture A Quantitative Approach), 关 ...