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执行语句。

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