MyBatis(一) xml檔案解析流程 Configuration
阿新 • • 發佈:2019-02-06
1.Configuration
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 列印查詢語句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<mappers>
<mapper resource="mapper/CompanyMapper.xml"/>
<mapper resource="mapper/WareHouseMapper.xml"/>
<mapper resource="mapper/ConsignmentInfoMapper.xml"/>
<mapper resource="mapper/CanvassingInfoMapper.xml" />
</mappers>
</configuration>
MyBatis的配置中心的初始化過程
1.觸發Configuration的入口
String resource = "mybatisConfig.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
System.out.println(e.getMessage());
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
2.SqlSessionFactoryBuilder的build方法在獲取SqlSessionFactory需要先初始化配置資訊,並從配置檔案中解析獲取初始化SqlSessionFactory的必要資訊
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
//此處初始化XMLConfigBuilder,這個類對於Configuration的生成至關重要
XMLConfigBuilder e = new XMLConfigBuilder(reader, environment, properties);
//呼叫build方法傳入引數中的e.parse()返回結果就是Configuration物件
var5 = this.build(e.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException var13) {
;
}
}
return var5;
}
3.XMLConfigBuilder的parse方法負責呼叫parseConfiguration方法
public Configuration parse() {
if(this.parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
} else {
this.parsed = true;
this.parseConfiguration(this.parser.evalNode("/configuration"));
return this.configuration;
}
}
4.此處的parseConfiguration就是Configuration解析生成的極其重要的函式 this.parseConfiguration(this.parser.evalNode(“/configuration”));其中的this.parser.evalNode(“/configuration”)是呼叫了XPathParser類的evalNode方法返回的是XNode物件。XNode物件儲存瞭解析後的對應節點下的所有資訊
private void parseConfiguration(XNode root) {
try {
//解析properties節點並設定到Configuration
this.propertiesElement(root.evalNode("properties"));
//解析typeAliases節點並設定到Configuration
this.typeAliasesElement(root.evalNode("typeAliases"));
//解析plugin節點並設定到Configuration
this.pluginElement(root.evalNode("plugins"));
//解析objectFactory節點並設定到Configuration
this.objectFactoryElement(root.evalNode("objectFactory"));
//解析objectWrapperFactory節點並設定到Configuration this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
//解析settings節點並設定到Configuration
this.settingsElement(root.evalNode("settings"));
//解析environments節點並設定到Configuration 即Environments物件
this.environmentsElement(root.evalNode("environments"));
//解析databaseIdProvider節點並設定到Configuration this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
//解析typeHandlers節點並設定到Configuration
this.typeHandlerElement(root.evalNode("typeHandlers"));
//解析mappers節點並設定到Configuration
this.mapperElement(root.evalNode("mappers"));
} catch (Exception var3) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3);
}
}
5.XMLConfigBuilder的parseConfiguration裡負責所有的配置檔案節點的解析
總結:SqlSessionFactoryBuilder呼叫build方法,為了建立SqlSessionFactory。而SqlSessionFactory需要Configuration配置中心提供建立的條件。XMLConfigBuilder 將xml檔案流進行初始化並parse返回Configuration,返回之前需要通過parseConfiguration來真正為Configuration設定資訊,XPathParser負責將節點下的資訊轉換成XNode物件方便訪問。