configuration对象由xmlconfigbuilder按需构建并填充,通过parseconfiguration()依次解析properties、settings、typealiases、plugins、environments、mappers等标签,最终形成单例不可变的运行时上下文。

MyBatis 启动时,Configuration 对象是所有配置的“总容器”,它不是手动 new 出来的,而是由 XML 解析器按需构建并填充的。整个加载过程围绕 XMLConfigBuilder 展开,本质是一次结构化、分阶段的 XML 解析 + 配置注入。
Configuration 的加载入口在 SqlSessionFactoryBuilder.build()
调用链非常清晰:
-
SqlSessionFactoryBuilder.build(InputStream)→ 创建XMLConfigBuilder - 调用
parser.parse(),真正开始解析 -
parse()内部执行parseConfiguration(root),逐节点处理<configuration></configuration>下的子标签
XMLConfigBuilder.parseConfiguration() 按顺序解析核心配置项
该方法严格遵循 mybatis-config.xml 的结构,依次读取并设置 Configuration 的对应属性:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
<properties></properties>→ 加载外部属性文件或内联 property,存入configuration.variables -
<settings></settings>→ 解析如cacheEnabled、lazyLoadingEnabled等开关,设为configuration.settings(Properties 类型) -
<typealiases></typealiases>→ 注册别名,比如<typealias type="com.example.User" alias="User"></typealias>,存入configuration.typeAliasRegistry -
<plugins></plugins>→ 实例化拦截器(Interceptor),添加到configuration.interceptorChain -
<environments></environments>→ 解析数据源和事务管理器,构建Environment对象,赋值给configuration.environment -
<mappers></mappers>→ 扫描<mapper resource="..."></mapper>或<mapper class="..."></mapper>,触发XMLMapperBuilder加载 Mapper XML 或接口注解,生成MappedStatement并注册进configuration.mapperRegistry
Configuration 是单例且不可变的“运行时上下文”
它在 SqlSessionFactory 创建完成时就已固化:
- 生命周期与应用一致,全局唯一
- 后续每个 SqlSession 都持有一份对它的引用(非复制),用于获取 MappedStatement、TypeHandler、MapperProxyFactory 等
- 其内部集合类(如
mappedStatements、typeAliases)通常被包装为只读视图,防止运行时误改
补充:Mapper XML 的加载是二次解析,但归属 Configuration
<mappers></mappers> 标签本身不直接存 SQL,而是触发 XMLMapperBuilder 去加载独立的 Mapper 文件。这个过程会:
- 解析
<resultmap></resultmap>→ 构建ResultMap对象,放入configuration.resultMaps - 解析
<select>/<insert></insert></select>等 → 构建MappedStatement,放入configuration.mappedStatements - 注册接口类型到
mapperRegistry,为后续sqlSession.getMapper(Xxx.class)提供代理依据
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










