Spring 对MyBatis 的对象进行了管理,但是并不会替换MyBatis 的核心对象。也就意味着:MyBatis jar 包中的SqlSessionFactory、SqlSession、MapperProxy 这些都会用到。而mybatis-spring.jar 里面的类只是做了一些包装或者桥梁的工作。

所以第一步,我们看一下在Spring 里面,工厂类是怎么创建的。

我们在Spring 的配置文件中配置了一个SqlSessionFactoryBean,我们来看一下这个类。

它实现了InitializingBean 接口,所以要实现afterPropertiesSet()方法,这个方法会在bean 的属性值设置完的时候被调用。

另外它实现了FactoryBean 接口,所以它初始化的时候,实际上是调用getObject()方法,它里面调用的也是afterPropertiesSet()方法。

在afterPropertiesSet()方法里面:

第一步是一些标签属性的检查,接下来调用了buildSqlSessionFactory()方法。

然后定义了一个Configuration,叫做targetConfiguration。

426 行,判断Configuration 对象是否已经存在,也就是是否已经解析过。如果已经有对象,就覆盖一下属性。

433 行,如果Configuration 不存在,但是配置了configLocation 属性,就根据mybatis-config.xml 的文件路径,构建一个xmlConfigBuilder 对象。

436 行,否则,Configuration 对象不存在,configLocation 路径也没有,只能使用默认属性去构建去给configurationProperties 赋值。

后面就是基于当前factory 对象里面已有的属性,对targetConfiguration 对象里面属性的赋值。

Optional.ofNullable(this.objectFactory).ifPresent(targetConfiguration::setObjectFactory);

这个方法是Java8 里面的一个判空的方法。如果不为空的话,就会调用括号里面的对象的方法,做赋值的处理。

在第498 行,如果xmlConfigBuilder 不为空,也就是上面的第二种情况,调用了xmlConfigBuilder.parse()去解析配置文件,最终会返回解析好的Configuration 对象。

在第507 行, 如果没有明确指定事务工厂, 默认使用SpringManagedTransactionFactory 。它创建的SpringManagedTransaction 也有getConnection()和close()方法。

<property name="transactionFactory" value="" />

在520 行,调用xmlMapperBuilder.parse(),这个步骤我们之前了解过了,它的作用是把接口和对应的MapperProxyFactory 注册到MapperRegistry 中。

最后调用sqlSessionFactoryBuilder.build() 返回了一个DefaultSqlSessionFactory。

OK,在这里我们完成了编程式的案例里面的第一步,根据配置文件获得一个工厂类,它是单例的,会在后面用来创建SqlSession。

用到的Spring 扩展点总结:

接口 方法 作用
FactoryBean getObject() 返回由FactoryBean 创建的Bean 实例
InitializingBean afterPropertiesSet() bean 属性初始化完成后添加操作
BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry() 注入BeanDefination 时添加操作

MyBatis关键配置-创建会话工厂相关推荐

  1. MyBatis关键配置

    我们先看一下把MyBatis 集成到Spring 中要做的几件事情. 为了让大家看起来更直观,这里我们依旧用传统的xml 配置给大家来做讲解,当然使用配置类@Configuration 效果也是一样的 ...

  2. MyBatis关键配置-接口注入使用

    我们使用Mapper 的时候,只需要在加了Service 注解的类里面使用@Autowired注入Mapper 接口就好了. @Service public class EmployeeService ...

  3. MyBatis关键配置-接口的扫描注册

    在Service 层可以使用@Autowired 自动注入的Mapper 接口, 需要保存在BeanFactory(比如XmlWebApplicationContext)中.也就是说接口肯定是在Spr ...

  4. hibernate的映射关系配置及对会话工厂的初始化。以及struts2写实例查询

    1.首先获取hibernate的jar导入,不写. 2.hibernate关键配置映射文件有两个,关键工具一个 分别是: 核心配置 hibernate.cfg.xml 持久化类对象与数据库映射配置*. ...

  5. Hibernate api 之常见的类(配置类,会话工厂类,会话类)

    1:Configuration :配置管理类对象 1.1:config.configure(): 加载主配置文件的方法(hibernate.cfg.xml) ,默认加载src/hibernate.cf ...

  6. 实验5:配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、(FactoryBean测试)★

    实验5:配置通过静态工厂方法创建的bean.实例工厂方法创建的bean.(FactoryBean测试)★ bean的创建默认就是框架利用反射new出来的bean实例 工厂模式:工厂帮我们创建对象:有一 ...

  7. 总结xml配置spring-aop声明式事务配置与hibernate报错:** isno active spring和hibernate整合,原因会话工厂去路(到spring不仅仅是bean)错误

    spring事务管理太厉害了!!可以不再自管事务开发了! spring aop声明式事务配置 问题: 困扰我近十多天的的spring事务管理终于解决了, 再也不用自己管理事务了 嗯,可以删该死的hib ...

  8. 第 3-2 课:SpringBoot如何优雅地使⽤ MyBatis XML 配置版

    MyBatis 是现如今最流⾏的 ORM 框架之⼀,我们先来了解⼀下什么是 ORM 框架. ORM 框架 对象关系映射(Object Relational Mapping,ORM)模式是⼀种为了解决⾯ ...

  9. MyBatis——XML配置解析

    目录 1. 环境配置(environments) 2. 属性(properties) 3. 类型别名(typeAliases) 方式一:通过typeAlias起别名 方式二:通过package起别名 ...

最新文章

  1. 大量数据转移_大量数据
  2. wxWidgets:窗口样式
  3. 多线程断点续传下载软件-闪电下载2009
  4. Springsecurity-oauth2之/oauth/token的处理
  5. Shell 脚本编程之基础
  6. [开发技巧3]不显示报表直接打印
  7. c# 智能升级程序代码(2)
  8. Oracle创建表语句(Create table)语法详解及示例
  9. NoSQL介绍(七)
  10. 动态滤波网络论文解读
  11. 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)--有BUG,注意看我的备注
  12. excel转word后表格超出页面_妙招!Word和Execl“联姻”实现数据高效处理!
  13. Matlab电气课程设计,电气工程课程设计——基于Matlab异步电动机调速系统设计
  14. Zmap详细用户手册及DDOS的可行性
  15. VC++ 源码实现通达信公式管理器2
  16. ttl一会255一会64_什么是TTL 生存时间?Ping TTL的含义
  17. android引用aar中的字体,android.mk引用aar
  18. MacTeX新手学习笔记
  19. Python中的模块2
  20. 什么是DevOps模式

热门文章

  1. uva 1587(Box UVA - 1587)
  2. PyTorch学习问题记录
  3. Android Activity/Fragment间的数据传递
  4. Silverlight中如何实现上下标的显示
  5. 一度的让自己变得那么懒惰,不知道后路还会如何
  6. Jdom的SAXBuilder解析String形式的XML
  7. 64. Minimum Path Sum
  8. EJB3.0 注释小结
  9. Python 资料性网站。
  10. 简单帐表插件开发示例分享