(补充知识点: 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配置文件加载到内存的更多相关文章

  1. 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作

    前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...

  2. Spring源码分析:非懒加载的单例Bean初始化前后的一些操作

    之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于A ...

  3. 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)

    doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...

  4. Spring源码分析:非懒加载的单例Bean初始化过程(下)

    上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...

  5. Mybatis源码解读-SpringBoot中配置加载和Mapper的生成

    本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...

  6. 【Spring源码分析】非懒加载的单例Bean初始化过程(上篇)

    代码入口 上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了f ...

  7. Spring源码分析:非懒加载的单例Bean初始化过程(上)

    上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了finish ...

  8. vscode源码分析【八】加载第一个画面

    第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 第三篇:vscode源码分析[三]程序的启动逻辑,性能问题的追踪 ...

  9. 源码分析SpringCloud Gateway如何加载断言(predicates)与过滤器(filters)

    我们今天的主角是Gateway网关,一听名字就知道它基本的任务就是去分发路由.根据不同的指定名称去请求各个服务,下面是Gateway官方的解释: https://spring.io/projects/ ...

随机推荐

  1. oracle数据库函数之============‘’分析函数和聚合函数‘’

    1分析函数 分析函数根据一组行来进行聚合计算,用于计算完成狙击的累积排名等,分析函数为每组记录返回多个行 rank_number() 查询结果按照次序排列,不存在并列和站位的情况,可以用于做Oracl ...

  2. 设置git 不提交 修改权限的文件

    vim .git/config  打开文件

  3. 用margin还是padding

    用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时 ...

  4. mata属性

    声明文档使用的字符编码:    <meta charset="utf-8" />声明文档的兼容模式:         <meta http-equiv=" ...

  5. 怎么解决xp系统不能安装NET Framework4.0?

    第一步: 如果是XP系统: 1.开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ 2.开始——运行——输入%windir% 3.在打开的窗口中有个文件夹叫So ...

  6. UITabBarController

    Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈<「『[[[〝﹙﹛﹝$(.[{£¥ !%),.:;>?] ...

  7. F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)

          Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回.传阅.转交,都可以非常方便快捷地实现,管理员 ...

  8. 为Node.js编写组件的几种方式

    本文主要备忘为Node.js编写组件的三种实现:纯js实现.v8 API实现(同步&异步).借助swig框架实现. 关键字:Node.js.C++.v8.swig.异步.回调. 简介 首先介绍 ...

  9. 罗永浩Vs王自如:浮躁的世界该如何降温?!

    这段时间智能手机业界有一件事情炒得纷纷扬扬,可谓是波澜起伏,想必大家都多少略有耳闻.昨天中午在群里看到“罗永浩舌战王自如视频”分享,就有些‘凑热闹’的好奇点开看看.一开场的几分钟正如老罗所说的那样:两 ...

  10. MindManger学习技巧

    ctrl+shift+f 字体颜色