Spring整合Mybatis核心原理分析
Mybatis的注册逻辑:实现ImportBeanDefinitionRegistrar接口,重写其registerBeanDefinitions方法 :注册mapper接口,并将接口声明为FactoryBean,设置拦截方法,生成代理类。
1.3.2版本
通过@MapperScan导入了MapperScannerRegistrar类
- MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,所以Spring在启动时会调用MapperScannerRegistrar类中的registerBeanDefinitions方法
- 定义了一个ClassPathMapperScanner对象
ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
- 拿到需要扫描的包名
- 设置ClassPathMapperScanner对象可以扫描到接口
- scanner.doScan() 扫描包
- 扫描类路径查找候选组件
- 执行scanCandidateComponents()
- 重写的isCandidateComponent()认为接口是备选者Component
- 执行scanCandidateComponents()
- 通过利用Spring的扫描后,会把接口扫描出来并且得到对应的BeanDefinition
- 接下来把扫描得到的BeanDefinition进行修改,把BeanClass修改为MapperFactoryBean,把AutowireMode修改为byType
- 扫描完成后,Spring就会基于BeanDefinition去创建Bean了,相当于每个Mapper对应一个FactoryBean(单例的)
- 在MapperFactoryBean中的getObject方法中,调用了getSqlSession()去得到一个sqlSession对象,然后根据对应的Mapper接口生成一个代理对象
- 扫描类路径查找候选组件
- 定义了一个ClassPathMapperScanner对象