前言

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

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. 分辨率、像素和PPI

    屏幕尺寸是指屏幕对角线的长度,一般以英寸为单位,1英寸(inch)=2.54厘米(cm).传统意义上的照片尺寸也是这个概念.所以同样尺寸(指对角线)的屏幕,也可能长宽比率不同.像素(Pixel):是位 ...

  2. Spring Cloud 客服端负载均衡 Ribbon

    一.简介   Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署, ...

  3. 使用gzip优化web应用(filter实现)

    相关知识: gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户端加载后渲染呈现,这种情况文件一般都比较大,如果 ...

  4. MyBatis双数据源配置

    配置相关 jdbc 配置 #============================================================================ # MySQL # ...

  5. VR上天了!全景商业化落地了!——VR全景智慧城市

    几年前,VR创业公司SpaceVR就启动了旨在将宇航员视觉体验带给普通人的虚拟现实(VR)项目.SpaceVR计划将VR相机卫星送入太空,并将相机拍摄到的太空视频发送回地球,从而让VR用户身临其境地看 ...

  6. Python os.walk的用法与举例

    os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirnames, filena ...

  7. cef3和duilib简单仿有道词典学习

    由于最近换工作的原因,也没啥事,就简单学习了一下cef3和duilib,楼主之前是做MFC框架下的windows开发的,对界面库和新的客户端开发模式也有所了解,现在的大部分客户端都是基本的客户端框架下 ...

  8. dedecms的热门标签在那里修改

    很多人都在用dedecms,因为它不但开源,而且功能还很强大.有会员功能,评论功能,问答功能,积分功能,充值卡等.那么我们来看看很多同学在优黔图里面的提的问题-dedecms的热门标签在那里修改? 其 ...

  9. Linux版微信

    一.到github上下载https://github.com/geeeeeeeeek/electronic-wechat/releases下载linux-x64.tar.gz,具体根据操作系统是32位 ...

  10. WPF MVVM 架构 Step By Step(4)(添加bindings - 完全去掉后台代码)

    之前的改进已经挺棒的,但是我们现在知道了后台代码的问题,那是否可能把后台代码全部去除呢?这时候就该WPF binding 和 commands 来做的事情了. WPF就是以超吊的binding,com ...