前言

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

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. 转义字符及URI编码

    URL中的转义字符 当URL的参数中出现诸如+,空格,/,?,%,#,&,=等特殊字符串符号时,因为上述字符有特殊含义,导致服务器端无法正确解析参数. 解决办法:将这些字符转化成服务器可以识别 ...

  2. 第 12 章 MySQL 可扩展设计的基本原则

    前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体系,提升系统的扩展能力,通过组合 ...

  3. Ultimus BPM 金融与证券行业应用解决方案

    Ultimus BPM 金融与证券行业应用解决方案 行业应用需求 金融服务业的整合与全球化发展,带来高度竞争的国际市场,所牵涉的产业包括了商业.贷款.投资银行,以及保险公司和许多其它为企业和消费者提供 ...

  4. MyBatis通用Mapper开发

    通常情况下,MyBatis 的增删改查操作需要自己在相应xml中写相关语句, 但是运用相关工具,其实可以很方便的自动生成单表的所有增删改查(通用的多表联合查询还是需要自己写). 也可以根据具体环境,设 ...

  5. More 3D Graphics (rgl) for Classification with Local Logistic Regression and Kernel Density Estimates (from The Elements of Statistical Learning)(转)

    This post builds on a previous post, but can be read and understood independently. As part of my cou ...

  6. java 与操作系统进程同步问题(一)————互斥问题

    最近学校开设了操作系统原理课程,老师要求用任意语言去模拟进程的同步和互斥问题. 在尝试的写了之后,发现这个问题非常有意思,故想记录在博客中,作为自己的学习轨迹. 个人还是比较喜欢用Java语言,所以采 ...

  7. R中用黏贴板读取excel数据以及用R生成人名

    本人尚在超级菜鸟级别,中间有些代码写的很low,请不要见笑! 1.今天先跟大家分享一个小技巧,用黏贴板将excel中的数据读进R 首先选中要读入R的数据 如图,上面是我分析的病人相关资料,Ctrol+ ...

  8. Java中设计模式之单例设计模式-1

    单例作用 1 节省内存 2 可以避免多种状态导致状态冲突 单例的创建步骤 1 私有化构造方法 2 私有化声明的属性 3 getInstance 4 方法需要静态 单例分类 1.懒汉式 2.饿汉式 两种 ...

  9. IPv6启动五年后,距离我们究竟还有多远?

    作者:RicardoIPv6拥有更好的IP拓展性,更高的安全保障以及更快的传输速度,互联网协会将2012年6月6日定为了世界IPv6启动日,距此5年后,国内外Cloudflare.又拍云等CDN服务已 ...

  10. Navicat11全系列激活(注册机)

    Navicat是一款数据库管理工具, 用于简化, 开发和管理MySQL, SQL Server, SQLite, Oracle 和 PostgreSQL 的数据库: Navicat数据模型工具以图形化 ...