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>下的子标签
XMLConfigBuilder.parseConfiguration() 按顺序解析核心配置项
该方法严格遵循 mybatis-config.xml 的结构,依次读取并设置 Configuration 的对应属性:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
<properties>→ 加载外部属性文件或内联 property,存入configuration.variables -
<settings>→ 解析如cacheEnabled、lazyLoadingEnabled等开关,设为configuration.settings(Properties 类型) -
<typeAliases>→ 注册别名,比如<typeAlias type="com.example.User" alias="User"/>,存入configuration.typeAliasRegistry -
<plugins>→ 实例化拦截器(Interceptor),添加到configuration.interceptorChain -
<environments>→ 解析数据源和事务管理器,构建Environment对象,赋值给configuration.environment -
<mappers>→ 扫描<mapper resource="..." />或<mapper class="..." />,触发XMLMapperBuilder加载 Mapper XML 或接口注解,生成MappedStatement并注册进configuration.mapperRegistry
Configuration 是单例且不可变的“运行时上下文”
它在 SqlSessionFactory 创建完成时就已固化:
立即学习“Java免费学习笔记(深入)”;
- 生命周期与应用一致,全局唯一
- 后续每个 SqlSession 都持有一份对它的引用(非复制),用于获取 MappedStatement、TypeHandler、MapperProxyFactory 等
- 其内部集合类(如
mappedStatements、typeAliases)通常被包装为只读视图,防止运行时误改
补充:Mapper XML 的加载是二次解析,但归属 Configuration
<mappers> 标签本身不直接存 SQL,而是触发 XMLMapperBuilder 去加载独立的 Mapper 文件。这个过程会:
- 解析
<resultMap>→ 构建ResultMap对象,放入configuration.resultMaps - 解析
<select>/<insert>等 → 构建MappedStatement,放入configuration.mappedStatements - 注册接口类型到
mapperRegistry,为后续sqlSession.getMapper(Xxx.class)提供代理依据

















