Mybatis 源码分析--Configuration.xml配置文件加载到内存
(补充知识点: 1 byte(字节)=8 bit(位) 通常一个标准英文字母占一个字节位置,一个标准汉字占两个字节位置;字符的例子有:字母、数字系统或标点符号)
1.创建SqlSessionFactory
①Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); //获取mybatis配置文件的字符
注解:Resources类是在mybatis中定义的一个类;getResourceAsReader(String resource)方法返回的是一个Reader(字符)类型的值
getResourceAsReader(String resource)的源码
public static Reader getResourceAsReader(String resource) throws IOException {
Reader reader; //定义一个变量reader
if (charset == null) { //源码最前面定义了一个charset(字符集),此时为空
reader = new InputStreamReader(getResourceAsStream(resource)); //先以文件流的方式获取到资源,再将获取到的资源转化为字符
} else {
reader = new InputStreamReader(getResourceAsStream(resource), charset);
}
return reader; //返回获取到的文件字符
}
-----------------------------------------------------------------------------------------------------
以流的方式获取到资源的源码
public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
//classLoaderWrapper将ClassLoader进行了封装,因为ClassLoader是java用来加载配置文件的
InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
if (in == null) throw new IOException("Could not find resource " + resource);
return in; //将配置文件以文件流的形式返回
}
------------------------------------------------------------------------------------------------------
//SqlSession工厂建立者以返回的字符作为参数,建立SqlSession工厂,将配置文件中的各项参数赋值到sqlSessionFactory 中
②sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
建立SqlSession工厂源码
public SqlSessionFactory build(Reader reader) {
return build(reader, null, null);
}
-------------------------------------------------------------------------------------------------------
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties); //建立xml配置文件解析器
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
------------------------------------------------------------------------
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config); //通过parser解析将mybatis配置文件的信息作为参数传递进来,生成 DefaultSqlSessionFactory
}
③session = sqlSessionFactory.openSession(); //新建一个sqlSession
------------------------------------------------------------------
public SqlSession openSession() {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false); //参数值为(SIMPLE,null,false)
}
------------------------------------------------------------------
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment(); //获取到数据库环境
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); //通过环境,获取到事务工厂为jdbcTransactionFactory
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); //新建事务
final Executor executor = configuration.newExecutor(tx, execType); //新建代理执行器,里面有plugin(插件)的各项信息
return new DefaultSqlSession(configuration, executor, autoCommit); //新建DefaultSqlSession
} catch (Exception e) {
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
----------------------------------------------------------------------
就是将各个参数赋值
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
this.configuration = configuration;
this.executor = executor;
this.dirty = false;
this.autoCommit = autoCommit;
}
④到目前为止,sqlSession已经创建完毕,接下来可以使用了
Mybatis 源码分析--Configuration.xml配置文件加载到内存的更多相关文章
- 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作
前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...
- Spring源码分析:非懒加载的单例Bean初始化前后的一些操作
之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于A ...
- 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)
doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...
- Spring源码分析:非懒加载的单例Bean初始化过程(下)
上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...
- Mybatis源码解读-SpringBoot中配置加载和Mapper的生成
本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...
- 【Spring源码分析】非懒加载的单例Bean初始化过程(上篇)
代码入口 上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了f ...
- Spring源码分析:非懒加载的单例Bean初始化过程(上)
上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了finish ...
- vscode源码分析【八】加载第一个画面
第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 第三篇:vscode源码分析[三]程序的启动逻辑,性能问题的追踪 ...
- 源码分析SpringCloud Gateway如何加载断言(predicates)与过滤器(filters)
我们今天的主角是Gateway网关,一听名字就知道它基本的任务就是去分发路由.根据不同的指定名称去请求各个服务,下面是Gateway官方的解释: https://spring.io/projects/ ...
随机推荐
- aaa
aaaa 来自为知笔记(Wiz)
- 自定义UI集成微信、QQ、微博分享功能
目前社会化分享是一个非常常见的功能,通过阅读官方文档可以进行对应平台的分享.在项目中原本有微信的分享,后来需要集成QQ和微博的分享,于是想着用ShareSDK,在使用的过程中发现ShareSDK中的w ...
- 解决NGUI自动被设置LYAER
解决NGUI自动被设置LYAER uiwidget.cs1011行public void checklayer()这里修改 可以让LAYER不跟随父物体变动 但是这里有个问题 摄像机的CULL 不会被 ...
- swift_属性观察者
//: Playground - noun: a place where people can play import Cocoa var str = "Hello, playground& ...
- Excel中提取最大值的问题
在使用excel的时候,碰到了一个如下的问题 意思是以每个字母为条件,取这个字母下面的数字中的最大值,需要注意一个问题是每个字母下面的数字个数不一定相等,例如d下面有四个数字,可以设置如下公式解决: ...
- iedriverserver使用报错
在win7下面使用IEdriverserver报错: AttributeError: 'Service' object has no attribute 'process' 1,下载最新的ie ...
- js数组倒叙输出
第一种:是直接利用代码进行输出 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- SHAREPOINT 2013 列表之间相互关联
修改内容 1.增加列表设置,隐藏Aid字段操作 SharePoint 列表之间相互关联 例如两张列表之间的父子关系. 思路如下: 列表中新增列表项后会有一个唯一的ID,我们获取到该ID赋予子表即可将两 ...
- BZOJ1828 [Usaco2010 Mar]balloc 农场分配
直接贪心,我们把线段按照右端点从小到大排序,然后一个个尝试插入即可... 来证明贪心的正确性: 不妨设贪心得到的答案集合为$S$,最优解的答案集合为$T$ 若$S$不是最优解,那么$S \not= T ...
- idea初使用之配置使用maven仓库
idea使用的理由已经无需多说.现在已经超过了eclipse.java开发种占有44%.第一次使用上手还是挺难的.跟用惯了myeclipse的我来说.对于project的概念深入人心.还理解不了它的M ...