Mybatis源码解析-MapperProxy的创建
基于SpringBoot的Mybatis源码解析:
SpringBoot版本如下:
org.springframework.boot
spring-boot-starter-parent
2.5.2
Mybatis版本依赖如下:
org.springframework.boot
spring-boot-starter-jdbc
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.3
mysql
mysql-connector-java
runtime
Mybatis的使用效果
先来看一下引入Mybatis的效果,studentDAO
实际上是一个MapperProxy
对象
通过debug进去之后,可以看到sqlSession的执行:
这一切是如何发生的呢?那就得从mybatis-spring-boot-starter
的spring.factories
文件说起了。
可以看到Mybatis的自动化配置类是MybatisAutoConfiguration
。
源码解析
关键类的定义
MybatisAutoConfiguration
类中声明SqlSessionFactory
和SqlSessionTemplate
为bean交给Spring容器管理。
此类中的静态内部类MapperScannerRegistrarNotFoundConfiguration
引入静态内部类AutoConfiguredMapperScannerRegistrar
;
AutoConfiguredMapperScannerRegistrar
实现了ImportBeanDefinitionRegistrar
接口的 registerBeanDefinitions
方法,扫描所有Mapper
将所有Mapper
的beanDefinition
标记为MapperFactoryBean
类型的,依赖注入方式为AUTOWIRE_BY_TYPE
。
MapperFactoryBean
实现了FactoryBean#getObject()
方法,这样当创建mapper对象时(如studentDAO
)就会通过getObject()
方法来创建bean
factoryBean初始化
将factoryBean包装后缓存
容器的refresh()
方法里的invokeBeanFactoryPostProcessors
中,一层层下去...最后放在factoryBeanInstanceCache
里
获取bean
通过重写factoryBean
的getObject
方法,调用sqlSession
来创建代理对象
填充属性SqlSessionFactory
和SqlSessionTemplate
,在他们的setter方法中会赋值给sqlSession
,后面创建代理对象的时候会用到
通过factoryBean的getObject()
方法获取代理对象:
MapperProxyFactory
代码如下: