00-总结
2026/9/27大约 1 分钟
mybaits的缓存
- 缓存是装饰者模式实现的
- 一级缓存是sqlSession级别的,创建Sqlsession是构建Excuter的BaseExcuter的构造方法中创建了PerpetualCache对象的HashMap本地缓存
- 二级缓存是Mapper级别的,保存在MappedStatement中,也是PerpetualCache对象的HashMap本地缓存。
- 缓存先查询二级缓存 - 在查一级缓存 - 查数据库
mybatis解析Mapper的xml文件生成Mapper的代理对象。
详情请看[[02-Mybatis中Mappr配置文件源码解析]]
- mappper的xml配置解析后生成的MappedStatement(解析XML/注解后的SQL元数据),然后存放在了
SqlSession的Configuration。 - 当SqlSession
spring整合mybatis的原理
详情请看[[05-Spring整合mybatis源码解析]]
代理:mybaitis的mapper接口的实现是通过jdk动态代理方式生成的。
添加mapper的BeanDefinition时机:MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar接口,ImportBeanDefinitionRegistrar的
registerBeanDefinitions方法会为IOC容器中注入BeanDefinitionmapper扫描方式:Spring的Bean扫描器ClassPathBeanDefinitionScanne是不允许接口注册成为BeanDefinition。所以需要自定义扫描器,mybatis通过重写ClassPathBeanDefinitionScanne的isCandidateComponent方法,避开了Spring不能注册接口成为Bean定义的规则。
偷天换日:将BeanDefinitiont的BeanClass替换为FactoryBean的,在创建Bean对象时,返回的时通过FactoryBean的
getObject()方法Bean,在getObject()中调用SqlSession的getMapper方法会根据configuration中MappedStatement配置信息,通过JDK动态代理的方式创建代理对象。