本文共 1819 字,大约阅读时间需要 6 分钟。
SpringBoot与MyBatis相互配合的加载原理及实现机制
SpringBoot与MyBatis的协同工作原理
在SpringBoot应用中,MyBatis的加载与初始化过程主要通过以下几个关键步骤完成:
Bean的加载过程:
- 加载:Spring扫描所有标有注解的类。
- 注册:将发现的Bean注册到BeanDefinitionMap中。
- 实例化:IOC容器完成Bean的实例化。
MyBatis Bean的注册:
- MyBatis的Bean通常需要通过
BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor来注册。 - 这些PostProcessor在Spring初始化过程中会被调用,负责将MyBatis相关Bean注册到Spring的BeanDefinitionMap中。
Spring初始化MyBatis入口
在Spring的AbstractApplicationContext中,refresh()方法负责刷新应用上下文,具体流程如下:
prepareRefresh():准备上下文进行刷新。 obtainFreshBeanFactory():获取新的BeanFactory实例。 prepareBeanFactory(beanFactory):准备BeanFactory,准备好后续的处理。 postProcessBeanFactory(beanFactory):调用所有BeanFactoryPostProcessor。 invokeBeanFactoryPostProcessors(beanFactory):调用所有相关的PostProcessor。 registerBeanPostProcessors(beanFactory):注册处理Bean创建的PostProcessor。 finishBeanFactoryInitialization(beanFactory):完成BeanFactory的初始化工作。 在invokeBeanFactoryPostProcessors方法中,主要处理包括:
- 调用
BeanDefinitionRegistryPostProcessor,用于处理BeanDefinition注册。 - 调用
BeanFactoryPostProcessor,用于处理Bean的后置处理。
MyBatis源码实现
MyBatis的初始化主要通过以下步骤完成:
SqlSessionFactoryBuilder:负责构建SqlSessionFactory。 DefaultSqlSessionFactory:创建SqlSessionFactory实例。 SqlSessionTemplate:创建SqlSessionTemplate实例,负责管理SqlSession。 在SqlSessionTemplate中,通过动态代理创建SqlSession实例,核心逻辑在MapperProxy中实现。
MyBatis中的缓存机制
一级缓存(方法缓存)
- 默认启用,无法关闭。
- 缓存范围:同一个SqlSession中,相同的查询方法。
- 缓存机制:通过
methodCache来实现,查询结果会存入缓存,下次直接取用。
二级缓存(mapper缓存)
- 可配置,默认关闭。
- 缓存范围:同一Mapper接口定义的命名空间,基于MapperID和参数进行缓存。
- 实现:通过
CacheExecutor来管理,查询结果会存入二级缓存,跨SqlSession共享。
常见问题解答
MyBatis的缓存机制
- 一级缓存:存储在
methodCache中,适用于同一个SqlSession内的重复查询。 - 二级缓存:存储在
mapperCache中,适用于跨SqlSession的查询,基于Mapper接口定义的命名空间。
MyBatis中的$和#符号
$:用于参数占位符,支持动态参数赋值,不会转义。 #:用于参数占位符,支持动态参数赋值,且会对参数进行转义处理。
MyBatis中的resultMap和resultType
resultMap:用于将多个结果字段映射到不同的POJO对象。 resultType:用于指定结果对象的类型,适用于单个结果对象的映射。
通过以上机制,SpringBoot与MyBatis实现了高效的数据库操作和缓存管理,充分发挥了ORM工具的优势。
转载地址:http://vchfk.baihongyu.com/