SqlSessionFactoryBean的构建流程
目的
此文的主旨在于梳理SqlSessionFactoryBean的初始流程,不拘泥于实现细节。
使用
SqlSessionFactoryBean的主要作用便是用来创建SqlSessionFactory,在它的构建过程中会解析MyBatis所需要的配置文件,将所有配置都封装到Configuration类中,最后返回SqlSessionFactory实例。SqlSessionFactoryBean实现了Spring中两个用于初始化Bean的接口FactoryBean、InitializingBean.
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为sqlSessionFactory的SqlSessionFactoryBean实例,并且为实例指定了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的构建流程的更多相关文章
- [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2
之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...
- Tcp客户端构建流程
tcp客户端构建流程 tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机.查手机卡.设置铃声.等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多 示 ...
- 廖雪峰Java12maven基础-1maven入门-3构建流程
maven是一个Java项目管理和构建工具: 标准化项目结构 标准化构建流程(编译.打包.发布) 依赖管理 Maven的构建流程 clean 删除所有编译生成的文件 compile 编译源码.编译测试 ...
- webpack的构建流程
一.运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条webpack机制中,去改变webpa ...
- rpm构建流程学习总结
rpm构建流程 学习链接: b站马哥: https://www.bilibili.com/video/BV1ai4y1N7gp RedHat: https://access.redhat.com/do ...
- Dockerfile与Docker构建流程解读
摘要 本文主要讨论了对docker build的源码流程进行了梳理和解读,并分享了在制作Dockerfile过程中的一些实践经验,包括如何调试.优化和build中的一些要点.另外,还针对现有Docke ...
- [Android] 基于 Linux 命令行构建 Android 应用(三):构建流程
Android 应用的构建过程就是将 Android 项目中的文件和资源进行编译和打包,最后将结果输出到 .apk 文件..apk 文件是保存二进制文件的容器,它包含了运行安卓应用所需的所有信息,例如 ...
- CI Weekly #22 | flow.ci 新版 iOS 构建流程的 4 大变化
好久不见,最近 flow.ci 针对 iOS 项目重新设计了创建项目的流程,较之前相比有 4 个变化: 在创建项目阶段加入项目有效性检测,大大减少了构建失败率,有问题早发现! 在创建项目阶段加入项目配 ...
- tensorflow项目构建流程
https://blog.csdn.net/hjimce/article/details/51899683 一.构建路线 个人感觉对于任何一个深度学习库,如mxnet.tensorflow.thean ...
随机推荐
- Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的
其实也就是通过接口名与mapper的id绑定在一起(即相同),通过SQL去写实现类,返回数据.
- MySQL索引原理及优化
一.各种数据结构介绍 这一小节结合哈希表.完全平衡二叉树.B树以及B+树的优缺点来介绍为什么选择B+树. 假如有这么一张表(表名:sanguo): (1)Hash索引 对name字段建立哈希索引: 根 ...
- (转)SQL SERVER 生成建表脚本
https://www.cnblogs.com/champaign/p/3492510.html /****** Object: StoredProcedure [dbo].[GET_TableScr ...
- Ubuntu 装nexus
装nexus前提是装好JDK和maven 先下载 wget http://download.sonatype.com/nexus/oss/nexus-2.12.0-01-bundle.tar.gz 再 ...
- java虚拟机--->>程序计数器
程序计数器是一块较小的内存空间,他可以看做是当前线程所执行的行号指示器.在虚拟机的概念模型(仅是概念模型,各种虚拟机可能会通过一些更高效率的方式去实现)里,字节码解释器工作室就是通过改变这个计数器的值 ...
- Windbg驱动双机调试环境配置
[由于进入了Windows驱动编程领域第一步就是搭建环境,整个环境来说说难也不难,只是比较麻烦.文章有些地方比较繁琐的,而且别人写的比较好,作为引用参考直接贴连接了.如果你按照我写的一步步完成,很快就 ...
- error link 2019 waveout
winmm.lib的影响 在做音频播放的时候使用到了win系统音频函数waveout; 但是报错: error link 2019 无法解析外部符号:waveoutGetnumDevice /clos ...
- GPL_LGPL
LGPL 与GPL的区别 GPL(GNU General Public License) 我们很熟悉的Linux就是采用了GPL.GPL协议和BSD, Apache Licence等鼓励代码重用的 ...
- 项目总结17-使用layui table分页表格
项目总结17-使用layui table分页表格总结 前言 在项目中,需要用到分页的表格来展示数据,发现layui的分页表格,是一个很好的选择:本文介绍layui table分页表格的前后端简单使用 ...
- Head First Servlets & JSP 学习笔记 第十一章 —— Web应用部署
jar:java archive(java归档) war:web archive(web归档) war文件只是Web应用结构的一个快照,采用了一种更可移植的压缩形式(它实际上就是一个jar文件).建立 ...