目的

此文的主旨在于梳理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. leetcode1028

    class Solution(object): def __init__(self): self.List = list() def rdfs(self,S): if S != '': length ...

  2. ---mingw Linux交叉编译给Window的工具

    https://arrayfire.com/cross-compile-to-windows-from-linux/

  3. Python导出MySQL数据库中表的建表语句到文件

    为了做数据对象的版本控制,需要将MySQL数据库中的表结构导出成文件进行版本化管理,试写了一下,可以完整导出数据库中的表结构信息 # -*- coding: utf-8 -*- import os i ...

  4. PhoenixFD插件流体模拟——UI布局【Resimulation】详解

    Liquid Resimulation 流体再(重)渲染 本文主要讲解Resimulation折叠栏中的内容 主要内容 Overview 综述 Parameters 参数 综述 Liquid Resi ...

  5. m3u8文件什么合成便于播放的MP4的方法

    先大家要知道M3U8文件不是一个视频文件,里面全是一些路径,说白了就是一个目录而已,所以要看视频,要找到对应存放视频的文件夹.如果不知道怎么找,可以使用文本格式打开M3U8文件,里面会有路径提示.   ...

  6. 如何强制停止http请求

    http请求很多时候会受到网络阻塞.重连等原因导致响应很慢,如果此时做了一些操作,但过几秒后又响应了之前的请求,就会造成很多问题,此时我们可以使用abort()方法强制停止http请求: let aj ...

  7. 用<pre>预格式化的文本

    被包围在 <pre> 标签 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. 提示: <pre> 标签的一个常见应用就是用来表示计算机的源代码.

  8. maven发布jar包到私服

    1.setting.xml配置 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi=&quo ...

  9. ES6 Iterator

    不同数据集合怎么用统一的方式读取 可以用for...of循环了

  10. 完全理解 Python 迭代对象、迭代器、生成器

    完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun    本文源自RQ作者 ...