mybatis-plus-3.0 通用crud实现原理
mapper创建流程(@MapperScan 具体实现细节)
1》factory创建之后回调各个BeanFactoryPostProcessor
2》ConfigurationClassPostProcessor#processConfigBeanDefinitions 处理@Configuration注解
3》 依次处理 application(@SpringBootConfiguration)、@ComponentScan(会处理所有注入的bean)
4》 处理各个Configuration
5》 处理各种 ImportSelector 和ImportBeanDefinitionRegistrar
6》 MapperScannerRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar)解析@MapperScan,并且把每一个接口的工厂类设置为org.mybatis.spring.mapper.MapperFactoryBean
7》 factory 创建各个bean、设置属性、回调InitializingBean(开始注入逻辑)
8》 org.mybatis.spring.mapper.MapperFactoryBean<T>(DaoSupport).afterPropertiesSet
9> com.baomidou.mybatisplus.core.MybatisConfiguration.addMapper plus接管了mapper的管理职责
10》 MybatisMapperAnnotationBuilder.parse plus 通用的crud的注入逻辑
a: AbstractSqlInjector.inspectInject主逻辑:
获取方法列表 getMethodList
依次调用 inject 即injectMappedStatement(生成mybatis的动态xml脚本,注入不同的statement)
b: parseStatement:解析注解里的sqlSource(自定义的基于注解的动态注入)
c: parsePendingMethods: 处理还没有解析完的method
总结(初始化的时候注入动态代理的接口): 创建bean + 注入通用crud
app-> componentScan-> configuration->ImportBeanDefinitionRegistrar
MapperScannerRegistrar -> afterPropertiesSet->MybatisMapperAnnotationBuilder.parse
plus hack的类有 MybatisConfiguration、MybatisMapperRegistry、核心逻辑是MybatisMapperAnnotationBuilder.parse