mybatis-spring集成源码解析
2021-11-04 22:32:40 0 举报
mybatis spring 集成源码解析
作者其他创作
大纲/内容
@MapperScan
BeanDefinitionRegistryPostProcessor
scan方法中调用重写后的doScan()方法当扫描到所有的Mapper后,会返回一个BeanDefinition集合,然后调用processBeanDefintions(beanDefinitions)
ImportBeanDefinitionRegistrar
该接口的方法
是一个非常重要的类Spring实例化这些Mapper时就是用该类该类是一个FactoryBean,实现了getObject()方法:public T getObject() throws Exception { return getSqlSession().getMapper(this.mapperInterface);}也就是说,Spring实例化该bean时,就会调用其getObject()方法该方法调用Mybatis的getMapper()方法,Mybatis的getMapper方法会使用JDK的动态代理返回一个Proxy代理对象(Mybatis源码)这样,该方法返回的对象就注册到Spring的单例池中了Service中就可以直接通过@Autowired注解引用了
ClassPathMapperScannermybatis继承了Spring的ClassPathBeanDefinitionScanner是一个BeanDefinition扫描器该类重写了一下两个重要方法:doScan(packages)isComponentCandidate(beanDefintion)
实现该接口
FactoryBean
实现了该接口
MapperFactoryBeanpublic T getObject() throws Exception { return getSqlSession().getMapper(this.mapperInterface);}
// postProcessBeanDefinitionRegistry方法中调用scanner.scan方法scanner.scan()
MapperScannerRegistrar
继承了Spring的扫描器类
注册的BeanDefinition是
MapperScannerConfigurer该类是一个BeanDefinitionRegistryPostProcessor(BDRPP)
ClassPathBeanDefinitionScanner
processBeanDefintions(beanDefinitions)循环处理所有的BeanDefinition,也就是扫描到的Mapper生成的Bean定义将所有的BeanDefinition的beanClass设置为MapperFactoryBean.class
doScan方法中会调用重写后的isComponentCandidate(beanDefininition)方法isComponentCandidate()方法中有一个重要逻辑:当指定包路径下是接口时,则说明是一个Mapper,则将其注册为BeanDefinition
// 实现该方法postProcessBeanDefinitionRegistry(registry)
执行完成scan方法后,所有的Mapper就被扫描并解析成BeanDefinition这些BeanDefinition会被放入beanDeinitionMap中然后在refresh的第11步,会将所有的BeanDefinition实例化成单例bean应用程序中就可以引用这些bean了
@Import
// 该方法new了一个扫描器:ClassPathMapperScanner// 用于扫描指定路径下的MapperClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
收藏
收藏
0 条评论
回复 删除
下一页