spring整套源码系列之【mybatis管理mapper代理对象源码分析】
2024-04-10 18:49:54 0 举报
spring整套源码系列之【mybatis管理mapper代理对象源码分析】
作者其他创作
大纲/内容
获取我们的bean定义 definition = (GenericBeanDefinition) holder.getBeanDefinition();
解析mapper扫描包并添加FactoryBean定义postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)#MapperScannerConfigurer
通过MapperFactoryBean的构造函数将mapper.class传进去,在getObject方法中会通过SqlSessionFactory.getMapper(\"\"mapper.class)返回我们的代理对象
通过bean定义类型注入SQLSessionFactory到当前mapperbean定义中definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
// 调用我们的bean工厂的后置处理器. invokeBeanFactoryPostProcessors(beanFactory);
是
registerBeanDefinitions(...)方法#MapperScannerRegistrar
通过构造函数把我们的mapper接口class传进去definition.getConstructorArgumentValues().addGenericArgumentValue(beanClassName)
mapper是接口类型的,最终不能实例化,mybatis做了很厉害的功能,改成FactoryBean,进行了偷天换日
为啥在这里mybaits却要指定AUTOWIRE_BY_TYPE了? 假设我们指定的是by_name的话,那么他会通过setXXX(入参)的引用名去ioc容器中获取值,假设我们自己配置sqlSessionFactory的bean的名称不是相同的那么就会抛出异常
添加MapperScan注解value属性值到mapper包扫描集合
@MapperScan(basePackages = {\"mapper\"})
把扫描到的mapper包路径添加到bean定义构造器中builder.addPropertyValue(\"basePackage\
注册
先调用BeanDefinitionRegistryPostProcessor处理器
调用
真正调用扫描我们@MapperScan指定的路径下的mapper包doScan(basePackages)#ClassPathMapperScanner
初始化用来放mapper扫描包的集合List<String> basePackages = new ArrayList<>();
spring解析配置类解析@Import注解调用
创建了MapperScannerConfigurer类型的bean定义构造器BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);
显示的new 一个ClassPathMapperScanner 包扫描器对象ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
获取我们的bean定义的className String beanClassName = definition.getBeanClassName();
spring解析配置类解析@Import注解
入口2
循环我们所有扫描出mapper的bean定义出来for (BeanDefinitionHolder holder : beanDefinitions)
registerBeanDefinitions(...)方法#ImportBeanDefinitionRegistrar
获取MapperScan注解属性对象,用来获取mapper扫描包路径AnnotationAttributes mapperScanAttrs = AnnotationAttributes .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));
入口1
mapperScanAttrs != null
给扫描器设置一堆属性
中间还会解析处理注解中其他的属性
添加mapper扫描包路径
添加MapperScan注解basePackages属性值到mapper包扫描集合
设置成factoryBean【MapperFactoryBean】 definition.setBeanClass(this.mapperFactoryBeanClass)
for循环mapperBean定义
重新找到被清理掉的PropertyResourceConfigurersprocessPropertyPlaceHolders();
调用父类ClassPathBeanDefinitionScanner 来进行扫描,扫描mapper包并生成bean定义集合Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);
将接口mapper改成factoryBeanprocessBeanDefinitions(beanDefinitions);
添加MapperScan注解basePackageClasses属性值到mapper包扫描集合
0 条评论
下一页