MyBatis源码解析【5】工厂的构建
前言
这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客
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】工厂的构建的更多相关文章
- MyBatis源码解析【2】构建项目
有了之前的准备,今天就要开始构建学习使用的项目了.废话不多说.开始吧. 首先我用IDEA构建了一个空的maven项目,然后加入了Mybatis的依赖. <dependencies> < ...
- Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例
在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...
- Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了
这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...
- 【MyBatis源码解析】MyBatis一二级缓存
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...
- mybatis源码-解析配置文件(三)之配置文件Configuration解析
目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...
- Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码
在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...
- Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取
在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们提到了两个问题: 1,为什么在以前的代码流程中从来没有addMapper,而这里却有getMapper? 2,UserDao ...
- Mybatis源码解析(一) —— mybatis与Spring是如何整合的?
Mybatis源码解析(一) -- mybatis与Spring是如何整合的? 从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...
- Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?
Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的? 如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一 ...
- Mybatis源码解析(三) —— Mapper代理类的生成
Mybatis源码解析(三) -- Mapper代理类的生成 在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...
随机推荐
- Linux parent process and child process when 'sudo'
如果在一般用户下如user,执行sudo命令,会产生两个进程. ps -ef | grep Container root 4305 643 0 16:37 pts/39 00:00:00 sudo . ...
- 机器学习:Python实现聚类算法(一)之K-Means
1.简介 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各 ...
- Spring-bean作用域scope详解
Spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext). singleton 在每个Spring IoC容器中一个bean定 ...
- 第 16 章 MySQL Cluster
前言: MySQL Cluster 是一个基于 NDB Cluster 存储引擎的完整的分布式数据库系统.不仅仅具有高可用性,而且可以自动切分数据,冗余数据等高级功能.和 Oracle Real Cl ...
- CentOS上安装NodeJs
(1)参照:http://www.cnblogs.com/zhangqingsh/archive/2013/04/15/3022583.html 安装Python2.7 (2)安装Nodejs yu ...
- ELK菜鸟手记 (四) - 利用filebeat和不同端口把不同服务器上的log4j日志传输到同一台ELK服务器
1. 问题描述 我们需要将不同服务器(如Web Server)上的log4j日志传输到同一台ELK服务器,介于公司服务器资源紧张(^_^) 2. 我们需要用到filebeat 什么是filebeat ...
- win7热点设置
1.设置热点名称与密码 netsh wlan set hostednetwork mode=allow ssid=costa key=11112222pause 2.开启 netsh wlan sta ...
- Python常用的第三方库
最近学习python 做些数据挖掘相关的练习,涉及到很多第三方的库,所以做一总结. Setuptools 可以让程序员更方便的创建和发布 Python 包,特别是那些对其它包具有依赖性的状况. 我特别 ...
- CSS浮动、绝对、相对定位
浮动 float:属性{ float:none; 默认值,对象,不漂浮 float:left; 文本流向对象的右边 float:right; }; 清除浮动 clear:属性{ clear:no ...
- sqlmap详细使用 [精简]
1. 基础用法: 一下./sqlmap.py 在kali和backtrack中使用sqlmap的时候,直接用:sqlmap ./sqlmap.py -u “注入地址” -v 1 –dbs // 列 ...