目的

此文的主旨在于梳理SqlSessionFactoryBean的初始流程,不拘泥于实现细节。

使用

SqlSessionFactoryBean的主要作用便是用来创建SqlSessionFactory,在它的构建过程中会解析MyBatis所需要的配置文件,将所有配置都封装到Configuration类中,最后返回SqlSessionFactory实例SqlSessionFactoryBean实现了Spring中两个用于初始化Bean的接口FactoryBeanInitializingBean.

InitializingBean定义如下

public interface InitializingBean {
/**
* 此方法在BeanFactory设置了Bean配置里的所有属性后执行。
*/
void afterPropertiesSet() throws Exception;
}

我们一般在XML中都会有这么一段配置,如下:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"/>
<!--主配置 -->
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<property name="mapUnderscoreToCamelCase" value="true"/>
</bean>
</property>
<!-- 加载mybatis映射文件 -->
<property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean>

上述配置的作用就是让容器创建一个ID为sqlSessionFactorySqlSessionFactoryBean实例,并且为实例指定了datasource属性,手动指定了主配置对象,开启MyBatis下划线转驼峰的属性配置,并且指定映射文件所在的位置。

注:

虽然指定的是SqlSessionFactoryBean实例,但是因为继承了FactoryBean接口,因此我们从容器拿到的对象实际上是getObject方法返回的对象,即SqlSessionFactory实例。

创建流程

首先自不用说,Spring会创建SqlSessionFactoryBean实例,设置配置的所有属性,这是第一步,接下来便会走afterPropertiesSet()方法。

@Override
public void afterPropertiesSet() throws Exception {
// 检查数据源
notNull(dataSource, "Property 'dataSource' is required");
// 检查SqlSessionFactoryBuilder, 已经在构造方法里初始化
notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");
// configuration实例与configLocation只能有一个
state((configuration == null && configLocation == null) || !(configuration != null && configLocation != null),
"Property 'configuration' and 'configLocation' can not specified with together");
// 解析配置文件,创建SqlSessionFactory。这属于MyBatis本身的内容,不再展开说明。
this.sqlSessionFactory = buildSqlSessionFactory();
}

创建SqlSessionFactory的过程与MyBatis不同的点主要在与transactionFactory,在创建事务工厂时不再使用MyBatis自带的JdbcTransaction类,而是使用SpringManagedTransactionFactory这个新的事务工厂类,这个事务获取到的连接全部来自于Spring管理,这样把事务全权交给Spring管理,而MyBatis本身不再涉及事务管理。如果在使用Spring时没有配置(使用)事务,那么获取到的连接取决于DataSource,无论拿到的连接是自动提交还是手动提交,MyBatis每一次方法调用都会视情况提交或回滚。当然对于自动提交而言,MyBatis的commit或者rollbakc是不会调用conn.commit()conn.rollback

在经过afterPropertiesSet方法后,SqlSessionFactory实例便创建完毕。需要使用SqlSessionFactory实例便会调用getObject方法。

@Override
public SqlSessionFactory getObject() throws Exception {
if (this.sqlSessionFactory == null) {
afterPropertiesSet();
}
return this.sqlSessionFactory;
}

SqlSessionFactoryBean的构建流程的更多相关文章

  1. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2

    之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...

  2. Tcp客户端构建流程

    tcp客户端构建流程 tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机.查手机卡.设置铃声.等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多 示 ...

  3. 廖雪峰Java12maven基础-1maven入门-3构建流程

    maven是一个Java项目管理和构建工具: 标准化项目结构 标准化构建流程(编译.打包.发布) 依赖管理 Maven的构建流程 clean 删除所有编译生成的文件 compile 编译源码.编译测试 ...

  4. webpack的构建流程

    一.运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条webpack机制中,去改变webpa ...

  5. rpm构建流程学习总结

    rpm构建流程 学习链接: b站马哥: https://www.bilibili.com/video/BV1ai4y1N7gp RedHat: https://access.redhat.com/do ...

  6. Dockerfile与Docker构建流程解读

    摘要 本文主要讨论了对docker build的源码流程进行了梳理和解读,并分享了在制作Dockerfile过程中的一些实践经验,包括如何调试.优化和build中的一些要点.另外,还针对现有Docke ...

  7. [Android] 基于 Linux 命令行构建 Android 应用(三):构建流程

    Android 应用的构建过程就是将 Android 项目中的文件和资源进行编译和打包,最后将结果输出到 .apk 文件..apk 文件是保存二进制文件的容器,它包含了运行安卓应用所需的所有信息,例如 ...

  8. CI Weekly #22 | flow.ci 新版 iOS 构建流程的 4 大变化

    好久不见,最近 flow.ci 针对 iOS 项目重新设计了创建项目的流程,较之前相比有 4 个变化: 在创建项目阶段加入项目有效性检测,大大减少了构建失败率,有问题早发现! 在创建项目阶段加入项目配 ...

  9. tensorflow项目构建流程

    https://blog.csdn.net/hjimce/article/details/51899683 一.构建路线 个人感觉对于任何一个深度学习库,如mxnet.tensorflow.thean ...

随机推荐

  1. leetcode279

    动态规划 public class Solution { public int NumSquares(int n) { var list = new List<int>(); list.A ...

  2. JRebel 代理激活

    1.生成GUID   https://www.guidgen.com/ 例:04cfff79-8f45-481c-a858-a5b9590422e7 2.License Server 例: http: ...

  3. python中os模块

    os  模块 操作系统模块,该模块主要处理与操作系统相关的操作 最常用是文件操作:打开.读取 import os os.getcwd() #获取当前执行文件夹路径 ​ os.chdir('dirnam ...

  4. Dom文本应用-表格隔行间亮样式

    效果:  隔行一个颜色,鼠标移上去,被选中的那一行就变颜色,其次,鼠标离开其区域,颜色又变回原来的颜色. 一.表格隔行间亮样式-HTML代码 首先我们要有个表格 <table id='tab1' ...

  5. 基于maven构建javaweb项目思路梳理及改进

    需要准备的东西: Jdk. myeclipse. maven包 预装jdk环境 1.maven安装及配置: a)      详见url https://www.cnblogs.com/eagle668 ...

  6. 基于PaddlePaddle的语义匹配模型DAM,让聊天机器人实现完美回复 |

    来源商业新知网,原标题:让聊天机器人完美回复 | 基于PaddlePaddle的语义匹配模型DAM 语义匹配 语义匹配是NLP的一项重要应用.无论是问答系统.对话系统还是智能客服,都可以认为是问题和回 ...

  7. AltiumDesigner 查找相似对象

    同类器件的集体选中.集体选中的方法是:先选中一个标识符,右击在选项表中选择Find Similar Objects,然后就会出现一个对话框,在这个对话框中,有一些any项,根据自己的需要把一些any改 ...

  8. 关于@autoreleasepool

    苹果推荐使用场景: 如果你编写的程序不是基于 UI 框架的,比如说命令行工具: 如果你编写的循环中创建了大量的临时对象:(常用) 如果你创建了一个辅助线程. @interface ViewContro ...

  9. jquery中bind和on的区别

    1.首先,来看看bind和on的语法. bind的用法: $('a').bind('click',[data],function(){}) 其事件的绑定者是固定的,就是a,第一个参数是事件,第二个参数 ...

  10. JavaSE基础知识(3)—流程控制结构

    一.顺序结构 1.说明 程序从上往下依次执行,中间没有任何跳转或选择2.特点 变量必须遵循 “前向引用” (局部变量必须先声明.赋值,然后再使用!) 二.分支结构(条件) 1.说明 程序从两条或多条路 ...