SqlSessionFactoryBuilder解析XML的核心是先由XMLConfigBuilder解析全局配置,再由XMLMapperBuilder解析映射文件,最终组装成Configuration对象。

SqlSessionFactoryBuilder 解析 XML 的核心动作是:用 XMLConfigBuilder 读取并结构化配置,再交由 XMLMapperBuilder 深度解析映射文件,最终组装成一个完整的 Configuration 对象。
XMLConfigBuilder 负责全局配置解析
当你调用 new SqlSessionFactoryBuilder().build(reader),底层会立即创建一个 XMLConfigBuilder 实例。它内部封装了基于 DOM 的 XPathParser(不是纯 SAX,实际混合使用),用于逐节点遍历 <configuration> 根元素下的所有子标签:
-
<properties>:加载外部属性,支持resource或url,并合并到运行时变量中 -
<settings>:转为Properties对象,如cacheEnabled、lazyLoadingEnabled等开关项被提取并校验 -
<typeAliases>:注册别名,支持<typeAlias>标签或包扫描,类名自动映射为短名 -
<plugins>:实例化拦截器(Interceptor),按声明顺序加入插件链 -
<environments>:解析数据源与事务管理器,根据environment参数激活指定环境 -
<mappers>:不直接解析 SQL,而是收集<mapper>的resource、url或class属性,为后续映射文件加载做准备
XMLMapperBuilder 负责 SQL 映射文件解析
在 XMLConfigBuilder 处理完 <mappers> 后,会对每个 resource="com/example/mapper/UserMapper.xml" 创建一个 XMLMapperBuilder。它真正把 XML 中的 SQL 片段翻译成可执行对象:
- 读取
<mapper namespace="com.example.mapper.UserMapper">,绑定到对应接口类型 - 将每个
<select id="selectById">转为MappedStatement,包含 SQL 文本、参数类型、结果映射规则 - 解析
<resultMap>生成ResultMap对象,处理嵌套查询、集合映射、自动映射策略 - 识别
<sql>片段并缓存为SqlFragment,供<include>引用 - 所有生成的
MappedStatement最终注册进Configuration.mappedStatements的Map<String, MappedStatement>
Configuration 是整个解析过程的归宿
所有解析结果不会散落各处,而是统一汇聚到一个 Configuration 实例中。它就像 MyBatis 的“内存配置中心”,保存着:
立即学习“Java免费学习笔记(深入)”;
- 数据源(
Environment)、类型处理器(TypeHandlerRegistry)、插件列表(interceptorChain) - 所有已注册的 Mapper 接口类型(
mapperRegistry)及其代理工厂 - 全部
MappedStatement,key 是namespace + "." + id(例如"com.example.mapper.UserMapper.selectById")
最后,XMLConfigBuilder.parse() 返回这个 Configuration,再由 SqlSessionFactoryBuilder.build(Configuration) 封装为 DefaultSqlSessionFactory —— 这就是你后续获取 SqlSession 的源头。


















