Spring源码分析(七)Spring整合mybatis 源码分析

​​​​​​​​​​​​​​​​​​​​​https://blog.csdn.net/caicongyang/category_2139981.html?spm=1001.2014.3001.5482 

我的其他Spring源码分析如上

1. @MapperScan注解中引入MapperScannerRegistrar

2.MapperScannerRegistrar继承了ImportBeanDefinitionRegistrar,在Spring其中过程中会调用其中的registerBeanDefinitions方法 得到一个 MapperScannerConfigurer 对象

3. 同时MapperScannerConfigurer是一个BeanDefinitionRegistryPostProcessor对象,会在Spring启动过程中调用postProcessBeanDefinitionRegistry方法;

4.在postProcessBeanDefinitionRegistry 方法钟实现中mybatis 自定义ClassPathMapperScanner 实现了Spring的 ClassPathBeanDefinitionScanner将mybatis的mapper接口扫描进来成为一个Spring的bean

5.把扫描下来的BeanDefinition进行修改,把beanClass 修改成为MapperFactoryBean,并把AutowireMode修改为byType

6.在MapperFactoryBean中的getObject方法中,调用了getSqlSession()去得到一个sqlSession 对象,然后根据对应的Mapper接口生成一个Mapper接口代理对象,这个代理对象就成为 Spring容器中的Bean

7.sqlSession对象是Mybatis中的,一个sqlSession对象需要SqlSessionFactory来产生

8.MapperFactoryBean的AutowireMode为byType,所以Spring会自动调用set方法,有两个set 方法,一个setSqlSessionFactory,一个setSqlSessionTemplate,而这两个方法执行的前提是 根据方法参数类型能找到对应的bean,所以Spring容器中要存在SqlSessionFactory类型的 bean或者SqlSessionTemplate类型的bean。

9.如果你定义的是一个SqlSessionFactory类型的bean,那么最终也会被包装为一个 SqlSessionTemplate对象,并且赋值给sqlSession属性

10.而在SqlSessionTemplate类中就存在一个getMapper方法,这个方法中就产生一个Mapper接 口代理对象

11.后续流程就会进入到Mybatis框架的底层执行流程

猜你喜欢

转载自blog.csdn.net/caicongyang/article/details/122900247
今日推荐