mybatis源码分析(1)-----sqlSessionFactory创建
- 首先了解一下mybatis,包含核心jar ,以及spring相关jar.
<!-- Mybatis相关组件 -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.3</version>
</dependency>
- 系列的文章也是mybatis 3.3.0和mybatis-spring1.2.3分析
- mybatis jar包中只要包含mybaits的核心业务sqlsession,sqlsessionFactory,configuration
- mybatis-spring 包中只要是和spring的相关集成,sqlSessionFactoryBean、transaction
- 加载mybatis
本文以spring中加载mybatis为参考,由一下代码加载mybatis
<!-- 配置集成Mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:/config/SQLMapConfig.xml" /><property name="mapperLocations"value="classpath*:com/chihiro/*/**/infra/mybatis/*Mapper.xml" />
</bean>
- sqlSessionFactory接口(mybatis包核心接口)
a、接口中有如下方法。子类中含有所有方法的实现
public interface SqlSessionFactory {SqlSession openSession();SqlSession openSession(boolean autoCommit);SqlSession openSession(Connection connection);SqlSession openSession(TransactionIsolationLevel level);SqlSession openSession(ExecutorType execType);SqlSession openSession(ExecutorType execType, boolean autoCommit);SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);SqlSession openSession(ExecutorType execType, Connection connection);Configuration getConfiguration();
}
b、接口的实现类,由sqlSessionFactoryBean产生的是默认的SqlSessionFactory(DefaultSqlSessionFactory)
- sqlSessionFactoryBean(mybatis-spring包下面的创建工厂的Bean,由spring 加载初始化)
a、从上述mybais的加载,可以看到,构造sqlSessionFactoryBean之后给了默认的属性值,dataSource,configLocation,mapper
public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class);private Resource configLocation;private Resource[] mapperLocations;private DataSource dataSource;//SqlSessionFactory 构造的协助类private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();private SqlSessionFactory sqlSessionFactory;//创建sqlSessionFactory的方法体protected SqlSessionFactory buildSqlSessionFactory() throws IOException {Configuration configuration;XMLConfigBuilder xmlConfigBuilder = null;if (this.configLocation != null) {xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), null, this.configurationProperties);configuration = xmlConfigBuilder.getConfiguration();} else {if (LOGGER.isDebugEnabled()) {LOGGER.debug("Property 'configLocation' not specified, using default MyBatis Configuration");}configuration = new Configuration();configuration.setVariables(this.configurationProperties);}...return this.sqlSessionFactoryBuilder.build(configuration);}ss@Overridepublic void afterPropertiesSet() throws Exception {notNull(dataSource, "Property 'dataSource' is required");notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");//调用方法创建sqlSessionFactorythis.sqlSessionFactory = buildSqlSessionFactory();}@Overridepublic void onApplicationEvent(ApplicationEvent event) {if (failFast && event instanceof ContextRefreshedEvent) {// fail-fast -> check all statements are completedthis.sqlSessionFactory.getConfiguration().getMappedStatementNames();}}}
- 实现3个相关接口的作用
FactoryBean接口:实现了该接口的类,在调用getBean(获取bean对象)的时候会返回该工厂返回的实例对象,也就是再调一次getObject方法返回工厂的实例。
InitializingBean接口:实现了这个接口,那么当bean初始化的时候,spring就会调用该接口的实现类的afterPropertiesSet方法,去实现当spring初始化该Bean的时候所需要的逻辑。
ApplicationListener接口:实现了该接口,如果注册了该监听的话,那么就可以了监听到Spring的一些事件,然后做相应的处理
2.在bean初始化之后,可以看见,回调方法afterPropertiesSet,在里面构造configuration对象。以及产生sqlSession
Configuration类:可以发现配置中读取configuration。(核心配置,关联mybatis整个生命周期)
xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), null, this.configurationProperties);configuration = xmlConfigBuilder.getConfiguration();
3.由sqlSessionFactoryBuild 构造sqlSessionFactory
public class SqlSessionFactoryBuilder {public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);}}
- 建设者模式
生产sqlSessionFacoty 使用了建设者模式(Builder)。其构造过程主要注入了Configuration的实例对象,sqlSessionFactoryBuilder 扮演具体的建造者,configuration类主要负责建造细节的工作,sqlSessionFactory则是建造出来的产品
- 总结
mybatis源码分析(1)-----sqlSessionFactory创建相关推荐
- mybatis源码分析2 - SqlSessionFactory的创建
1 主要类 初始化mybatis的过程,其实就是创建SqlSessionFactory单例的过程.下面是一个简单的初始化例子. String resource = "main/resourc ...
- MyBatis 源码分析之 SqlSession 创建
三哥 内容来自[自学星球] 欢迎大家来了解我的星球,和星主(也就是我)一起学习 Java ,深入 Java 体系中的所有技术.我给自己定的时间是一年,无论结果如何,必定能给星球中的各位带来点东西. 想 ...
- mybatis源码分析之事务管理器
2019独角兽企业重金招聘Python工程师标准>>> 上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的 ...
- MyBatis 源码分析 - 插件机制
1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...
- MyBatis 源码分析 - 缓存原理
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...
- MyBatis 源码分析 - SQL 的执行过程
本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...
- MyBatis 源码分析系列文章导读
1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...
- springboot集成mybatis源码分析-启动加载mybatis过程(二)
springboot集成mybatis源码分析-启动加载mybatis过程(二) 1.springboot项目最核心的就是自动加载配置,该功能则依赖的是一个注解@SpringBootApplicati ...
- MyBatis 源码分析-技术分享
2019独角兽企业重金招聘Python工程师标准>>> MyBatis 源码分析 MyBatis的主要成员 Configuration MyBatis所有的配置信息都保存在Confi ...
- Mybatis 源码分析(一)配置文件加载流程
Mybatis 源码分析(一)配置文件加载流程 1.项目构建 引入依赖 <dependency><groupId>org.mybatis</groupId>< ...
最新文章
- Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)
- 机器学习Tips:关于Scikit-Learn的 10 个小秘密
- mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式
- css中background-image背景图片路径设置
- 机器学习——KNN实现
- 安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
- CSP信息学奥赛知识总结
- 微信emoji表情json文档
- Web网页——留言板功能
- 小朋友适合读增广贤文么,增广贤文适合多大的孩子看?
- SEEDLAB2.0-Meltdown
- table 表格合并
- Python编程从入门到实践---pygame精灵组
- 笔记本处理器排名_【笔记本】AMD YES,霸占性能排行榜前四
- 狼的故事11:以牙还牙
- 几行代码解决京东购物界面
- python拼图游戏代码的理解_Python编写的数字拼图游戏(含爬山算法人机对战功能)...
- 我在阿里三年的运营经都在这儿了
- PDF/OCR识别提取工具:Readiris Pro 17 for Mac
- 工程伦理2021年春季学期线上课程习题全部解答
热门文章
- 独家:为了永不停机的计算服务 - 四月月刊 | 凌云时刻
- 朴灵:云计算的开发者视界中,OpenAPI 是绝对主角 | 凌云时刻
- 京东基础架构部招聘GO/JAVA架构师两名(T7+)
- 【优化调度】基于matlab蚁群算法求解无等待流水线调度优化问题【含Matlab源码 1516期】
- 【优化求解】基于matlab生物地理算法求解MLP问题【含Matlab源码 1415期】
- 【身份证识别】基于matlab BP神经网络身份证号码识别【含Matlab源码 1344期】
- 【数字信号】基于matlab 8级m序列【含Matlab源码 353期】
- oracle读写mysql_Oracle读写磁盘经过的缓存
- Latex:利用BibTeX批量导入参考文献
- 数据集:102 flower、Cratech256、ImageNet数据集下载