流程分析
首先,使用mybatis的时候会定义mapper接口的基础包,一般我们会用@MapperScanner这个注解,来看下这个注解
来看下这个MapperScannerRegistrar类
这个类实现了ImportBeanDefinitionRegistrar也就是spring注册beanDefined时候需用到,这个重写了一下,这个方法里,前面的话是一些基础属性的赋值,最重要的是这个方法
根据basePackages去进行扫描,来跟下这个方法
首先会调用父类生成一个BeanDefinitionHolder的集合,重点是这个方法processBeanDefinitions,而在这个方法里,重中之重的是这个
很形象,偷换概念了,将这个bean的实现类换成了MapperFactoryBean,它肯定实现了FactoryBean的接口并实现了getObject这个方法,getObject也就是我们实例化bean获取bean的途径,继续往下跟,果然
之后是这个
之后是这个
调用了MapperRegistry,来看下
最后到了MapperProxyFactory,来看下
按照如下的步骤进行调用的,最后通过jdk动态代理的方法,绑定mapper接口的最终实现是mapperProxy
总结
关于mybatis是如何将代理类绑定到mapper接口的,大概流程是这样,通过实现ImportBeanDefinitionRegistrar,重新定义这个beanClass为
MapperFactoryBean,这个类的话是一个FactoryBean有自己的getObject方法,通过调用当前对象的SqlSession对象的getMapper方法,转而到从这个对象的configuration对象中getMapper,进而从这个对象的mapperRegistry获取,而在MapperRegistry使用mapperProxyFactory实例化,通过代理绑定MapperProxy为这个接口的真正实现类,之后的话,我们调用mapper,其实就是调用了mapperProxy,之后的流程上一张已经提过
到此这篇关于Mybatis通过Spring完成代理类注入的流程分析的文章就介绍到这了,更多相关Mybatis Spring代理类注入内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qwe3642/article/details/119791727