本文基於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>。
完。