1. 首先了解一下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
  1. 加载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();}}}
  1. 实现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);}}
  1. 建设者模式

生产sqlSessionFacoty 使用了建设者模式(Builder)。其构造过程主要注入了Configuration的实例对象,sqlSessionFactoryBuilder 扮演具体的建造者,configuration类主要负责建造细节的工作,sqlSessionFactory则是建造出来的产品

  • 总结

mybatis源码分析(1)-----sqlSessionFactory创建相关推荐

  1. mybatis源码分析2 - SqlSessionFactory的创建

    1 主要类 初始化mybatis的过程,其实就是创建SqlSessionFactory单例的过程.下面是一个简单的初始化例子. String resource = "main/resourc ...

  2. MyBatis 源码分析之 SqlSession 创建

    三哥 内容来自[自学星球] 欢迎大家来了解我的星球,和星主(也就是我)一起学习 Java ,深入 Java 体系中的所有技术.我给自己定的时间是一年,无论结果如何,必定能给星球中的各位带来点东西. 想 ...

  3. mybatis源码分析之事务管理器

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的 ...

  4. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  5. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  6. MyBatis 源码分析 - SQL 的执行过程

    本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...

  7. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  8. springboot集成mybatis源码分析-启动加载mybatis过程(二)

    springboot集成mybatis源码分析-启动加载mybatis过程(二) 1.springboot项目最核心的就是自动加载配置,该功能则依赖的是一个注解@SpringBootApplicati ...

  9. MyBatis 源码分析-技术分享

    2019独角兽企业重金招聘Python工程师标准>>> MyBatis 源码分析 MyBatis的主要成员 Configuration MyBatis所有的配置信息都保存在Confi ...

  10. Mybatis 源码分析(一)配置文件加载流程

    Mybatis 源码分析(一)配置文件加载流程 1.项目构建 引入依赖 <dependency><groupId>org.mybatis</groupId>< ...

最新文章

  1. Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)
  2. 机器学习Tips:关于Scikit-Learn的 10 个小秘密
  3. mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式
  4. css中background-image背景图片路径设置
  5. 机器学习——KNN实现
  6. 安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
  7. CSP信息学奥赛知识总结
  8. 微信emoji表情json文档
  9. Web网页——留言板功能
  10. 小朋友适合读增广贤文么,增广贤文适合多大的孩子看?
  11. SEEDLAB2.0-Meltdown
  12. table 表格合并
  13. Python编程从入门到实践---pygame精灵组
  14. 笔记本处理器排名_【笔记本】AMD YES,霸占性能排行榜前四
  15. 狼的故事11:以牙还牙
  16. 几行代码解决京东购物界面
  17. python拼图游戏代码的理解_Python编写的数字拼图游戏(含爬山算法人机对战功能)...
  18. 我在阿里三年的运营经都在这儿了
  19. PDF/OCR识别提取工具:Readiris Pro 17 for Mac
  20. 工程伦理2021年春季学期线上课程习题全部解答

热门文章

  1. 独家:为了永不停机的计算服务 - 四月月刊 | 凌云时刻
  2. 朴灵:云计算的开发者视界中,OpenAPI 是绝对主角 | 凌云时刻
  3. 京东基础架构部招聘GO/JAVA架构师两名(T7+)
  4. 【优化调度】基于matlab蚁群算法求解无等待流水线调度优化问题【含Matlab源码 1516期】
  5. 【优化求解】基于matlab生物地理算法求解MLP问题【含Matlab源码 1415期】
  6. 【身份证识别】基于matlab BP神经网络身份证号码识别【含Matlab源码 1344期】
  7. 【数字信号】基于matlab 8级m序列【含Matlab源码 353期】
  8. oracle读写mysql_Oracle读写磁盘经过的缓存
  9. Latex:利用BibTeX批量导入参考文献
  10. 数据集:102 flower、Cratech256、ImageNet数据集下载