作者源码阅读笔记主要采用金山云文档记录的,所有的交互图和代码阅读笔记都是记录在云文档里面,本平台的文档编辑实在不方便,会导致我梳理的交互图和文档失去原来的格式,所以整理在文档里面,供大家阅读交流
【金山文档 | WPS云文档】 Mybatis-plus 自动装配与加载流程
相关重要类介绍说明
MybatisPlusAutoConfiguration 自动装配类
MyBatis-Plus 的 MybatisPlusAutoConfiguration
是 Spring Boot 自动配置的核心类,负责集成 MyBatis-Plus 的核心功能到 Spring Boot 项目中
核心作用
- 自动装配基础组件
- 自动创建
SqlSessionFactory
(通过MybatisSqlSessionFactoryBean
实现),并注入 MyBatis-Plus 的全局配置(如分页插件、性能分析插件) - 注册
MapperScannerConfigurer
,扫描指定包路径下的Mapper
接口,支持@MapperScan
注解的显式配置或默认路径扫描
- 条件化加载
- 通过
@ConditionalOnClass
和@ConditionalOnSingleCandidate
注解确保仅在类路径存在SqlSessionFactory
且数据源唯一时激活配置
名称 | 描述 | 默认值 |
properties | MyBatis-Plus 的
| |
interceptors | 用于管理和加载 MyBatis-Plus 内置插件的核心配置项
| |
typeHandlers | 用于管理类型处理器( | |
languageDrivers | 用于管理 MyBatis 的 SQL 方言驱动( | |
resourceLoader |
| |
databaseIdProvider |
过识别数据库厂商名称(如 与 MyBatis 原生机制兼容,支持在 Mapper XML 中通过 | |
configurationCustomizers | 用于对 MyBatis 原生配置(
| |
sqlSessionFactoryBeanCustomizers | 用于深度定制
| |
mybatisPlusPropertiesCustomizers | 用于动态定制
| |
applicationContext |
注意事项
需确保
避免在自定义组件中直接通过
若同时使用 |
MybatisSqlSessionFactoryBean类
MybatisSqlSessionFactoryBean
是 MyBatis-Plus 提供的核心工厂类,用于替代 MyBatis 原生的 SqlSessionFactoryBean
,专为简化 MyBatis-Plus 特性集成而设计
核心作用
- 自动增强 Mapper 接口
- 继承
BaseMapper
的接口无需手动编写 SQL,自动生成 CRUD 方法实现(如selectById
、insert
) - 支持逻辑删除、乐观锁等注解驱动的功能扩展
- 全局配置集成
- 通过
globalConfig
属性注入 MyBatis-Plus 的全局策略(如主键生成规则、字段自动填充处理器)
- 简化 XML 配置
- 自动扫描
mapperLocations
路径下的 XML 文件,并与 Mapper 接口动态绑定
实现机制
- 继承与扩展
- 继承 MyBatis 原生的
SqlSessionFactoryBean
,重写buildSqlSessionFactory()
方法,在初始化阶段注入 MyBatis-Plus 特有配置 - 示例:自动加载分页插件(
PaginationInnerInterceptor
)
- 与 Spring 整合
- 作为
FactoryBean
实现类,通过 Spring 容器管理SqlSessionFactory
生命周期,直接依赖 Spring 的DataSource
- 多数据源场景
- 需为每个数据源单独创建
MybatisSqlSessionFactoryBean
实例
名称 | 描述 | 默认值 |
RESOURCE_PATTERN_RESOLVER | 主要用于解析和加载 MyBatis 的映射文件(Mapper XML)资源 是
| |
METADATA_READER_FACTORY | 主要用于支持注解驱动的 Mapper 接口扫描和元数据解析
| |
configLocation |
核心功能
| |
configuration | 用于直接注入 MyBatis 核心配置对象(
| |
mapperLocations |
核心作用
| |
dataSource | 数据库连接源 | |
transactionFactory |
与 Spring 事务的协作机制
| |
configurationProperties | 用于动态配置 MyBatis 全局参数的重要字段 | |
sqlSessionFactoryBuilder | 默认MybatisSqlSessionFactoryBuilder 关键设计原则:Builder模式实现配置与构建的解耦,允许灵活扩展配置加载方式 | |
sqlSessionFactory | 负责生成 MyBatis 的核心操作入口
初始化触发时机:Spring 容器启动时通过
| |
environment | 用于指定 MyBatis 运行环境的关键配置字段
| |
failFast | 用于强制验证配置完整性的关键字段 | 当 |
plugins | 用于扩展 MyBatis 核心功能的关键配置字段 基础功能定位
| |
typeHandlers | 用于处理 Java 类型与 JDBC 类型转换的核心配置字段 | |
typeHandlersPackage | 是 MyBatis-Spring 集成中用于批量注册自定义类型处理器的核心配置属性 | |
defaultEnumTypeHandler | 用于统一配置枚举类型默认处理器的重要字段 | |
typeAliases | 用于简化 Java 类型全限定名的核心配置字段 | |
typeAliasesPackage | 是 MyBatis 与 Spring 整合时用于批量配置类型别名的核心属性 | |
typeAliasesSuperType | 用于限定类型别名扫描范围的重要配置属性 | |
scriptingLanguageDrivers | 用于配置脚本语言驱动的重要属性 | |
defaultScriptingLanguageDriver | 是 MyBatis 与 Spring 整合时用于指定默认脚本语言驱动的关键配置属性 | |
databaseIdProvider | 是 MyBatis 与 Spring 整合时用于支持多数据库厂商兼容的核心配置属性 | |
vfs | 配置虚拟文件系统(Virtual File System)的重要属性 | |
cache | 用于配置 MyBatis 缓存行为的核心属性 | |
objectFactory | 用于自定义 MyBatis 对象实例化过程的重要配置属性 | |
objectWrapperFactory | 用于自定义对象包装行为的重要配置属性 | |
applicationContext | 用于与 Spring 应用上下文集成的重要属性 | |
globalConfig | 用于配置 MyBatis-Plus 全局行为的核心属性 |
MybatisSqlSessionFactoryBuilder 扩展类
MyBatis-Plus 的 MybatisSqlSessionFactoryBuilder
是 MyBatis 原生SqlSessionFactoryBuilder
的扩展类,主要用于构建支持 MyBatis-Plus 特性的 SqlSessionFactory
实例。
核心作用
- 增强的工厂构建器
- 继承自 MyBatis 原生的
SqlSessionFactoryBuilder
,在构建SqlSessionFactory
时注入 MyBatis-Plus 的全局配置(如分页插件、性能分析插件等) - 通过
MybatisSqlSessionFactoryBean
间接调用,实现与 Spring 的无缝集成
- 与 MyBatis-Plus 的协作
- 在
MybatisPlusAutoConfiguration
中初始化,通过build()
方法生成包含 MP 特性的SqlSessionFactory
- 支持自动加载 MyBatis-Plus 的
XMLMapperBuilder
,解析自定义注解(如@TableName
)
MybatisXMLMapperBuilder 类
MybatisXMLMapperBuilder 是 MyBatis-Plus 框架中用于解析 Mapper XML 文件的核心组件,它在原生 MyBatis 的 XMLMapperBuilder 基础上进行了功能增强
核心作用
- XML 映射文件解析
- 负责将 Mapper XML 文件中的 SQL 语句、参数映射、结果映射等配置转换为 MyBatis 内部对象结构
- 动态 SQL 支持
- 增强了对 MyBatis-Plus 特有动态 SQL 语法的解析能力
- 注解集成
- 支持解析 MyBatis-Plus 特有的注解配置(如 @TableField 等)
- 解析流程
1. 解析 namespace → 2. 处理缓存配置 → 3. 解析 resultMap →
4. 解析 SQL 片段 → 5. 增强解析 CRUD 节点
MybatisConfiguration 类
MybatisConfiguration 是 MyBatis-Plus 对原生 MyBatis Configuration 类的扩展实现
核心作用
- 全局配置容器
- 继承自 MyBatis 原生 Configuration 类,作为 MyBatis-Plus 增强功能的配置中心
- 功能扩展入口
- 通过重写父类方法实现 MyBatis-Plus 特有功能(如逻辑删除、自动填充等)的集成
名称 | 描述 | 默认值 |
mybatisMapperRegistry | 该字段在 MybatisConfiguration 中替换了原生 Configuration 的 MapperRegistry | |
caches | 核心功能
与原生实现的差异
| |
resultMaps | 用于管理结果映射 | |
parameterMaps | 用于管理参数映射 | |
keyGenerators | 用于管理主键生成策略 | |
sqlFragments | sqlFragments 字段是用于管理 SQL 片段 | |
mappedStatements | 核心功能
与原生实现的差异
|
MybatisMapperRegistry mapper注册器
MybatisMapperRegistry 是 MyBatis-Plus 扩展自 MyBatis 原生 MapperRegistry 的核心组件,负责管理 Mapper 接口与代理工厂的注册和绑定关系
核心作用
- 负责注册和管理所有 Mapper 接口的动态代理实现
- 支持 MyBatis-Plus 特有的 SQL 方法注入机制
- 实现 BaseMapper 通用方法的动态注册
与原生实现的差异
- 增强注册逻辑
- 重写了 addMapper 方法,在注册时会自动注入 MyBatis-Plus 的通用 CRUD 方法
- SQL 注入器集成
- 通过该字段与 SqlInjector 配合实现动态 SQL 方法注入
- 扩展点支持
- 支持通过 GlobalConfig 配置自定义的 Mapper 注册逻辑
工作流程
- 初始化阶段
- MybatisConfiguration 构造时会创建 MybatisMapperRegistry 实例
- Mapper 注册过程
- 1. 解析 Mapper 接口方法
- 2. 注入 BaseMapper 通用方法
- 3. 处理自定义 SQL 注入器方法
- 4. 生成 MapperProxy 动态代理
- 执行阶段
- 通过 MapperProxy 调用具体方法时,会委托给注册器中对应的 MappedStatement
名称 | 描述 | 默认值 |
config | 存储了对 MyBatis 核心配置对象的引用 | |
knownMappers | knownMappers 是 MyBatis-Plus 核心组件 MybatisMapperRegistry 中的关键数据结构,负责管理 Mapper 接口与代理工厂的映射关系 |
MybatisMapperAnnotationBuilder 类
MybatisMapperAnnotationBuilder 是 MyBatis-Plus 扩展自 MyBatis 原生 MapperAnnotationBuilder 的核心组件,负责解析 Mapper 接口上的注解并构建对应的 SQL 映射
核心作用
- 注解解析增强
- 支持 @TableName、@TableField 等 MyBatis-Plus 特有注解
- SQL 注入扩展
- 自动注入 BaseMapper 中的通用 CRUD 方法
- 与 MybatisMapperRegistry 协同
- 作为 MybatisMapperRegistry 的解析器,完成 Mapper 接口的最终注册
- Lambda 表达式支持
- 为方法生成支持 Lambda 表达式的 SQL 构建逻辑
工作流程
- 初始化阶段
- MybatisMapperRegistry 创建 MybatisMapperAnnotationBuilder 实例并传入配置和 Mapper 接口类
- 解析过程
- 1. 解析接口上的类级别注解
- 2. 逐个解析接口方法
- 3. 构建对应的 MappedStatement
- 4. 注册到 Configuration 中
- SQL 注入
- 在解析过程中会自动注入 BaseMapper 的通用方法实现
与原生实现的差异
- 方法注入机制
- 原生仅解析已有方法,MyBatis-Plus 会额外注入通用方法
- SQL 优先级调整
- 采用 "XmlSql > sqlProvider > CurdSql" 的加载顺序
- 扩展点丰富
- 提供更多可扩展的解析钩子和回调接口
ISqlInjector sql注入器
ISqlInjector 是 MyBatis-Plus 中用于 SQL 方法注入的核心接口,负责将自定义的 SQL 方法注入到 Mapper 接口中。
ISqlInjector 是 MyBatis-Plus 实现自动化 CRUD 和自定义方法扩展的核心机制,通过它可以灵活地扩展 Mapper 接口的功能
核心功能
ISqlInjector 是 MyBatis-Plus 实现"只做增强不做改变"理念的关键组件,负责将 BaseMapper 中的通用 CRUD 方法以及自定义方法注入到 Mapper 接口中
核心方法
public interface ISqlInjector {
void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass);
}
该方法接收两个参数:
MapperBuilderAssistant
:MyBatis 的 Mapper 构建助手mapperClass
:当前要处理的 Mapper 接口类
工作原理
- 注入流程
- 提取 Mapper 接口的泛型实体类
- 初始化 TableInfo 表信息对象
- 获取要注入的方法列表
- 循环调用每个方法的 inject 方法完成注入
- 与 MybatisMapperAnnotationBuilder 的协作
- 在解析 Mapper 接口时,如果发现接口继承了 MyBatis-Plus 的 Mapper 接口,就会调用 ISqlInjector 进行方法注入
AbstractSqlInjector 抽象实现类
抽象实现类,提供了基础的注入逻辑:
- 通过反射获取实体类信息
- 初始化 TableInfo 表信息对象
- 循环注入方法列表中的方法
DefaultSqlInjector 默认实现类
- 默认实现类,已经包含了 BaseMapper 的基础方法(如 selectById、insert 等)
AbstractMethod 抽象类
AbstractMethod 是 MyBatis-Plus 中用于定义可注入 SQL 方法的抽象基类,属于 SQL 注入器(ISqlInjector)体系的核心组件
核心作用
- SQL 方法模板
- 封装了通用 SQL 方法的生成逻辑,每个子类对应一种特定的 SQL 操作
- 与 ISqlInjector 协同
- 作为 ISqlInjector.getMethodList() 的返回元素,完成具体方法的注入
- 动态 SQL 支持
- 通过 LanguageDriver 生成最终执行的 SQL 语句
具体实现类
- SelectById/SelectByIds/SelectByMap/SelectCount/SelectList....
- Delete/DeleteById/DeleteByIds
- Insert
- Update/UpdateById
工作流程
- 初始化阶段
- ISqlInjector 获取方法列表时实例化 AbstractMethod 子类
- 注入阶段
- 调用 inject 方法生成 MappedStatement 并注册到 Configuration
- 执行阶段
- 通过 MybatisMapperRegistry 找到对应的 MappedStatement 执行
自动装配与加载流程图整理
元数据映射图
- 原生myabtis配置文件加载元数据图
- mybatis-plus 扩展BaseMapper后元数据图