mybatis spring boot starter 是怎么做的
Overview
要与 Spring 一起使用 MyBatis,你至少需要一个 SqlSessionFactory 和一个 mapper 接口。
MyBatis-Spring-Boot-Starter 将会:
- 自动探测存在的 DataSource
- 将使用 SqlSessionFactoryBean 创建并注册一个 SqlSessionFactory 的实例,并将探测到的 DataSource 作为数据源
- 将创建并注册一个从 SqlSessionFactory 中得到的 SqlSessionTemplate 的实例
- 自动扫描你的 mapper,将它们与 SqlSessionTemplate 相关联,并将它们注册到Spring 的环境(context)中去,这样它们就可以被注入到你的 bean 中
MyBatis-Spring-Boot-Starter 是一个开箱即用的解决方案,用于将 MyBatis 与 Spring Boot 集成。它简化了 MyBatis 的配置和使用,同时充分利用了 Spring 的依赖注入和生命周期管理功能。以下是它的实现原理的详细解析:
-
自动配置的实现
MyBatis-Spring-Boot-Starter 利用了 Spring Boot 的自动配置机制,通过 @EnableAutoConfiguration 和 spring.factories 文件实现自动化配置。
-
spring.factories
MyBatis-Spring-Boot-Starter 的 spring.factories 文件中包含如下配置:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
这意味着 Spring Boot 启动时会加载 MybatisAutoConfiguration,自动配置 MyBatis。
-
MybatisAutoConfiguration
该类的职责是自动创建和配置核心 MyBatis 组件,包括: -
SqlSessionFactory:负责生成和管理数据库连接会话。
-
SqlSessionTemplate:Spring 管理的线程安全的 MyBatis 操作类。
-
Mapper 接口的动态代理:将 Mapper 接口注入到 Spring 容器中。
-
-
SqlSessionFactory 的创建
MybatisAutoConfiguration 会自动配置 SqlSessionFactory。其核心步骤包括:
- 加载配置文件和配置信息
- 如果用户提供了自定义的 MyBatis 配置文件(mybatis.config-location),则加载用户的配置文件。
- 如果用户未指定配置文件,则使用默认配置。
- 加载数据库映射文件(Mapper XML)
MybatisProperties 中的 mapper-locations 属性指定了 Mapper XML 文件的路径。这些 XML 文件会被 ResourcePatternResolver 加载并绑定到 SqlSessionFactory。 - 集成插件
如果有自定义的拦截器(如分页插件),它们会通过 MybatisConfiguration 加入到 MyBatis 配置中。
-
Mapper 接口的动态代理
MyBatis 提供了 MapperProxy 用于动态代理接口,Spring Boot Starter 通过以下步骤将其与 Spring 管理的 Bean 注入机制集成:
-
扫描 Mapper 接口
@MapperScan 注解会扫描指定包中的 Mapper 接口,并将这些接口交由 Spring 管理。
例如:@MapperScan("com.example.mapper") public class Application {}
-
注册 Mapper 动态代理对象
Spring 将 Mapper 接口动态代理为 MapperProxy 对象,并通过 SqlSessionTemplate 与数据库交互。 -
自动注入
在服务类中直接通过 @Autowired 注入 Mapper 接口即可使用,而无需手动创建对象。
-
-
事务管理
MyBatis-Spring-Boot-Starter 完全兼容 Spring 的事务管理机制:
- 声明式事务
使用 @Transactional 注解管理事务,Spring 会通过事务拦截器将事务的开启、提交或回滚委托给 MyBatis。 - 事务集成点
Spring 通过 DataSourceTransactionManager 管理数据库事务,而 SqlSessionTemplate 会感知事务的存在,确保与事务管理器保持一致。
-
MyBatis 配置的定制化
MyBatis-Spring-Boot-Starter 支持高度的配置定制化,用户可以通过以下方式自定义行为:
- 配置属性
通过 application.properties 或 application.yml 文件,设置与 MyBatis 相关的属性。例如:
- 配置属性
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.domain
- 覆盖默认配置
如果需要更复杂的自定义配置,可以实现 SqlSessionFactoryBeanCustomizer 接口,手动修改 SqlSessionFactoryBean 的属性。 - 动态 SQL
使用 MyBatis 的动态 SQL 功能,通过条件动态生成 SQL 查询语句。
-
插件机制
MyBatis 支持自定义插件(Interceptor),可以拦截以下四种操作:
- Executor:执行 SQL 语句。
- ParameterHandler:处理 SQL 参数。
- ResultSetHandler:处理结果集。
- StatementHandler:处理 SQL 语句的构建。
Spring Boot 会自动加载用户定义的插件,只需在配置中注册插件类。
-
与 Spring Boot DevTools 的集成
MyBatis-Spring-Boot-Starter 支持 Spring Boot 的开发工具(DevTools),在代码热重载时能够正确刷新 Mapper 接口和配置文件。
-
优点总结
- 简化配置:无需手动配置 DataSource、SqlSessionFactory 和 Mapper。
- 与 Spring 完美集成:支持声明式事务、依赖注入和 Spring 生命周期管理。
- 灵活性:支持高度定制化的 MyBatis 配置。
- 开箱即用:提供默认配置,减少了开发复杂度。
Reference
- https://github.com/mybatis/spring-boot-starter/blob/master/mybatis-spring-boot-autoconfigure/src/site/zh_CN/markdown/index.md
- https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/zh_CN/index.html