MyBatis 源碼解析-解析xml配置文件

1.構建者模式創建SqlSessionFactory 

     

2.進入 SqlSessionFactory build方法

// <1> 創建 XMLConfigBuilder 對象
// <2> 執行 XML 解析
// <3> 創建 DefaultSqlSessionFactory 對象

2.1  創建 XMLConfigBuilder 對象

     

2.1.1  執行XPathParser構造方法,主要是爲了構建以下變量

2.1.2  XMLConfigBuilder構造方法,主要是加入兩個註冊器,存儲的是別名與類名的映射關係,別名其實就是xml配置文件裏Type屬性值

typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);

2.2 解析xml

2.2.1 evalNode 主要是將Node封裝成Xnode,裏面的詳細解析過程就是java xpath解析xml成java對象,主要看下解析配置文件吧,它主要是按照xml文件中的節點一個一個解析的

2.2.1.1   // <10> 解析 <environments /> 標籤 environmentsElement(root.evalNode("environments"));  先拿這個解析吧,主要是創建jdbc連接需要的資源。一層一層的解析配置

<environments default="development">

    <environment id="development">
        <transactionManager type="JDBC">
            <property name="" value=""/>

        </transactionManager>
        <dataSource type="UNPOOLED">
            <property name="driver" value="org.hsqldb.jdbcDriver"/>
            <property name="url" value="jdbc:hsqldb:mem:automapping"/>
            <property name="username" value="sa"/>
        </dataSource>
    </environment>
</environments>

// txFactory -->JdbcTransactionFactory

TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
//dsFactory -->UnpooledDataSourceFactory

DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));

//environmentBuilder.build()-->Environment-->configuration 

configuration.setEnvironment(environmentBuilder.build());

經過上面的一陣折騰,configuration將環境信息裝到自己的包裏了。

2.2.1.2  // <13> 解析 <mappers /> 標籤

根據配置文件裏的xml它會走如下邏輯,這次使用  mapper構造器 XMLMapperBuilder

開始解析xxx-mapper.xml

//存儲資源  <mapper resource="org/apache/ibatis/autoconstructor/AutoConstructorMapper.xml"/>
protected final Set<String> loadedResources = new HashSet<>();
//存儲mapper類
protected final MapperRegistry mapperRegistry = new MapperRegistry(this);

至此configuration前期xml解析完成。這些動作都是圍繞configration 來轉的。可能需要自己掌握java Xpath,反射,設計模式。期待下一篇,獲取session執行語句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章