springboot中mybatis如何把dao下的接口注册到spring

前言:在各大论坛找mybatis和springboot/spring相互关系的文章,不是很多,想自己看下源码分析mybatis怎么把dao解析并注册到spring。

环境准备,org.springframework.boot系列jar,mybatis-spring-boot-starter.jar

1 先看下我们在springboot中配置mybatis的内容,springboot通过mapper-locations: classpath*:com/**/dao/**/*DAO.xml  


2 开始我们的分析,我们从MapperScannerRegistrar和ClassPathMapperScanner开始说起把(至于程序如何从启动执行到ClassPathMapperScanner需要自行调试了,步骤太多,说完需要掀开spring一堆堆代码)。它是mybatis-spring.jar的类,功能是扫描步骤1中的dao路径并获取到beanDefinition,即类的定义数据。


mybatis注册入口



读取到dao路径下的接口内容

3 装载beanDefinition各项数据,包括beanClass,即MapperFactoryBean.class。dao中接口使用的是该类承载代理类,该类实际继承spring的FactoryBean,目的是借助getObject(),放置和存储不同自身的bean。怎么理解?比如需要用到UserService,通常在UserService加上注解@Service是自己注册成bean,而dao下的所有接口实际是代理类MapperProxy生成的动态代理类(下面会说到)。所以需要用spring的FactoryBean方式来实现。

装载beanDefinition

4 dao的接口实际实例化的时机,是在完成bean触发的。在org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)开始看


这里与其他正常写业务的bean一样,往下慢慢不一样了


MapperFactoryBean继承FactoryBean所以这里会有方法逻辑

5 在上一步中可以看到dao的bean执行了doGetObjectFromFactoryBean的逻辑,执行后会进入MapperFactoryBean的实例化了

这个之后就会进入真正实例化逻辑


继续往下


进行往下看到了正主


6 MapperRegistry是什么,MapperRegistry就是dao接口实际代理类生成的地方


最后就是在这生成的代理类

7 总结,springboot读取mybatis的xml并解析,之后初始化实际调用mybatis的MapperRegistry,最后通过MapperProxy结合JDK生成动态代理类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容