spring boot mybatis源码 (一)—— 如何读取加载配置文件
本文基于spring-boot-starter-parent:1.5.15.RELEASE,mybatis-spring-boot-starter:1.3.2(mybatis:3.4.6)。
spring boot mybatis的配置文件有两种,application 和 XML。
本文主要目的是理清mybatis加载配置信息的过程。
首先,系统启动
1、MybatisAutoConfiguration 构造
2、MybatisAutoConfiguration.sqlSessionFactory()
this.properties 的类型是 MybatisProperties,它的内容是 application.yml(或application.properties) 中以 mybatis 开头的设置
this.properties.getConfigLocation,即 mybatis XML 配置文件的路径
this.properties.getConfiguration,即 application.yml 中 mybatis.configuration的所有内容
下图代码中,当 configLocation 和 configration 都为空时,new Configuration(),然后在133行 factory.setConfiguration()
在sqlSessionFactory()的最后一步是,factory.getObject(),该方法最终进入SqlSessionFactoryBean.buildSqlSessionFactory()
3、SqlSessionFactoryBean.buildSqlSessionFactory()
根据前面的分析,当application.yml 的 mybatis.configurationLocation 和 mybatis.configuration 都为空时,会new Configuration,也就是下图398行的第一个if
若mybatis.configLocation 非空 configuration 为空,该地址指向 XML 配置文件,进入405行 else if,new 一个 XMLConfigBuilder;
若mybatis.configuration 非空 configLocation 为空,进入 408 行 else(因为在sqlSessionFactory()中不会new Configuration,参考前面的分析)。
在 XMLConfigBuilder 的私有构造中86行,首先也会new Configuration,对应上图中407行 xmlConfigBuilder.getConfiguration()。因此,不论是 application.yml的 mybatis.configuration 还是 XML配置文件,最终都会被解析成 Configuration类。
4、如何把XML配置文件加入到Configuration中?
在SqlSessionFactoryBean.buildSqlSessionFactory()中,调用 xmlConfigBuild.parse()
接着,调用parseConfiguration,解析 XML 中的元素,并添加到Configuration类中。
下图中的变量 parser,类型为XPathParser,它是对XPath类的封装,作用即为解析XML文件内容。
代码99行,parser.evalNode("/configuration"),就是在解析 mybatis XML配置文件的 configuration节点,我们知道 mybatis XML配置文件的根节点即 <configuration>。
完。