1. 程式人生 > >MyBatis(一) xml檔案解析流程 Configuration

MyBatis(一) xml檔案解析流程 Configuration

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物件方便訪問。