mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析

前言:在spring boot框架中,mybatisplus是怎么生成mapper接口代理类的❓
猜测:通过jdk动态代理生成这个接口的实体类,然后…

spring boot中,我们引入mybatisplus的依赖后,猜测是有自动配置的,我们在第三方包中找,找到如下显示:
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第1张图片
我们找到mybatisPlus依赖包中的spring.factories目录,里面显示的就是配置类了。我们顺着这个配置类往下顺。

MybatisPlusAutoConfiguration类,这个类是我们讨论的入口类,也是mybatisPlus的自动配置类,它的主要作用是:
创建sqlSessionFactory对象且唯一
创建sqlSessionTemplate对象且唯一
注册mapper对象

我们通过打断点的方式来看看它的运行过程
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第2张图片
在MybatisPlusAutoConfiguration类中分别执行 setBeanFactory和setResourceLoader方法来获取到默认的BeanFactory和ApplicationContext全局作用域对象。

接下来执行到MapperScannerRegistrar类中的registerBeanDefinitions方法
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第3张图片
这个类的主要逻辑就是这个registerBeanDefinitions方法。大致思路是:
获取到主启动类中MapperScan注解的值,也就是mapper接口的路径
创建类路径mapper扫描器
给扫描器赋各种属性
执行扫描,这里扫描的是mapper接口的路径

上面扫描具体使用的是ClassPathMapperScanner类中的doScan方法。
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第4张图片
ClassPathMapperScanner类的主要作用就是扫描mapper接口并生成这些mapper接口的Bean,这些Bean是符合mybatisPlus逻辑需要的Bean并且放入到了LinkedHashSet中保存。

接着执行MapperScannerConfigurer类中的postProcessBeanDefinitionRegistry方法,这个方法是对注册的Bean的后置处理,设置它们作为MapperFactoryBeans
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第5张图片
接着进行后置处理的一系列处理,下面截出其中一张。
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第6张图片
注册好Bean以后,回到了配置类MybatisPlusAutoConfiguration中创建sqlSessionFactory和sqlSessionTemplate,如下图:
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第7张图片
到这里配置类MybatisPlusAutoConfiguration的作用就结束了,也就是spring boot对于mybatisPlus的自动配置初始化就结束了。

真正创建mapper接口代理对象是在要用到mapper接口实例的时候,才会创建,也就是懒加载的模式。继续以断点的方式带大家看看是如何触发创建代理类和创建代理类的过程。
spring容器启动后执行refresh方法来将要用到的对象注册进容器中,我们这里是Controller->Service->mapper
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第8张图片
这里创建Controller对象,发现要用到Service对象,继续下去
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第9张图片
这里创建Service对象,发现它需要Mapper对象,继续下去
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第10张图片
这里是开始获取Mapper对象!

然后通过BeanName生成该Bean的MapperFactoryBean对象
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第11张图片
后续通过这个MapperFactoryBean工厂对象就能得到该Bean的代理类了。

接下来解析这个mapper接口对应的类路径下的mapper.xml
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第12张图片
然后绑定这个mapper接口的命名空间,这也就是后续mybatisPlus执行mapper接口时能直接找到对应的mapper.xml执行的缘由,如下图:
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第13张图片
这个方法就是用于绑定mapper和命名空间,将命名空间namespace和对应的接口Class对象封装到Configuration对象中。

接下来就是进行对应mapper的Bean的注册了,如下图:
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第14张图片
mybatisPlus中的注册其实就是将mapper接口的Class对象和它对应的代理工厂对象PageMapperProxyFactory分别作为key和value存储在HashMap中。到这里mapper的注册就完成了。

然后就到SqlSessionTemplate类中开始获取代理对象了
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第15张图片
传入的是接口的Class对象,方便jdk反射来生成代理对象

在MapperRegistry类中的getMapper方法中执行jdk反射
mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析_第16张图片
MybatisMapperRegistry类是mybatis底层的用于创建mapper接口代理对象的类。通过getMapper方法,得到这个接口的代理工厂类:mapperProxyFactory,通过这个代理工厂类创建代理对象。
至此,mapper接口的实例创建完毕了。

你可能感兴趣的:(mybatis,spring,boot,java,spring)