Mybatis加载XML配置文件源码之XMLConfigBuilder
2023-09-24 23:28:50
深入解析 MyBatis XMLConfigBuilder 的配置文件加载机制
简介
MyBatis 是一款备受推崇的持久层框架,其配置文件 mybatis-config.xml 充当框架运行的基石。XMLConfigBuilder 是解析此配置文件的关键组件,将配置信息解析为 MyBatis 内部的数据结构,为数据库连接、SQL 映射等后续操作奠定基础。本文将深入探讨 XMLConfigBuilder 的源码,揭开其解析过程的神秘面纱。
XMLConfigBuilder 的解析流程
XMLConfigBuilder 的解析流程主要包含以下步骤:
-
创建 XMLMapperBuilder 实例
XMLConfigBuilder 在构造函数中创建 XMLMapperBuilder 实例,负责解析单个 mapper 文件。
-
解析配置文件
XMLConfigBuilder 使用 SAXParser 解析 mybatis-config.xml 配置文件,并根据不同标签触发特定的解析逻辑。
-
解析类型别名
当遇到
<typeAliases>
标签时,XMLConfigBuilder 解析别名配置,将类名与别名进行映射。 -
解析环境
当遇到
<environments>
标签时,XMLConfigBuilder 解析环境配置,包括数据源、事务管理器等信息。 -
解析映射器
当遇到
<mappers>
标签时,XMLConfigBuilder 解析 mapper 配置,并加载相应的 mapper 文件进行解析。
数据结构构建
在解析过程中,XMLConfigBuilder 根据配置文件中的配置信息构建以下数据结构:
- Configuration :保存整个 MyBatis 配置信息的对象。
- MapperRegistry :保存所有已加载的 mapper 信息。
- TypeAliasRegistry :保存类型别名映射信息。
- Environment :保存环境配置信息。
解析示例
以下是一个简单的 mybatis-config.xml 配置文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<typeAliases>
<typeAlias type="com.example.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED"/>
</environment>
</environments>
<mappers>
<mapper resource="com/example/UserMapper.xml"/>
</mappers>
</configuration>
XMLConfigBuilder 解析此配置文件,构建出如下数据结构:
Configuration configuration = new Configuration();
MapperRegistry mapperRegistry = new MapperRegistry();
TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
Environment environment = new Environment();
// ...
结论
XMLConfigBuilder 是 MyBatis 解析配置文件的关键组件,通过 SAXParser 解析 mybatis-config.xml 配置文件,并根据不同标签触发不同的解析逻辑。最终构建出 Configuration、MapperRegistry、TypeAliasRegistry、Environment 等数据结构,为 MyBatis 之后的运行奠定基础。
常见问题解答
1. XMLConfigBuilder 是如何创建 XMLMapperBuilder 实例的?
XMLConfigBuilder 在构造函数中通过调用 new XMLMapperBuilder(parser) 来创建 XMLMapperBuilder 实例。
2. XMLConfigBuilder 如何解析 <typeAliases>
标签?
XMLConfigBuilder 使用 TypeAliasRegistry 的 registerAlias 方法解析 <typeAliases>
标签,将类名映射到别名。
3. XMLConfigBuilder 如何解析 <environments>
标签?
XMLConfigBuilder 使用 EnvironmentBuilder 解析 <environments>
标签,创建 Environment 对象来保存环境配置。
4. XMLConfigBuilder 如何解析 <mappers>
标签?
XMLConfigBuilder 使用 MapperAnnotationBuilder 和 XMLMapperBuilder 解析 <mappers>
标签,加载和解析 mapper 文件。
5. XMLConfigBuilder 构建的数据结构在 MyBatis 中有何作用?
- Configuration:包含 MyBatis 的全局配置信息,例如环境、类型别名和插件。
- MapperRegistry:保存已加载的 mapper 接口和对应的 MapperProxyFactory。
- TypeAliasRegistry:保存类名和别名之间的映射关系。
- Environment:保存特定环境的配置信息,例如数据源和事务管理器。