Mybatis加载Mapper
2021-06-30 13:11:59 6 举报
mybatis
作者其他创作
大纲/内容
先从Configuration中的mapperRegistry缓存获取
引入方式1:@MapperScan进行引入
这里以MapperFactoryBean为例子
这里做的事就是对BeanDefinition进行修改,1:将其原有的Class以构造函数的参数方式传进去2:将该Class修改为FactoryBean-->MapperFactoryBean.class3:设置这个beanDefinition自动注入的模式为ByType,即MapperFactoryBean的内部需要的属性是通过bytype方式注入的,及SqlSessionFactory和SqlSessionTemplate
refresh
isCandidateComponent(AnnotatedBeanDefinition beanDefinition)
..........
在Spring扩展点中的注册点进行处理
没有则动态代理创建mapperProxyFactory.newInstance(sqlSession)
populateBean
getBean(SomeService)
getSqlSession().getMapper(this.mapperInterface)sqlSession是自动注入获取的这里的mapperInterface就是创建该BeanDefinition时通过构造函数传入的BeanClass,来实现动态创建该Bean
isCandidateComponent(MetadataReader metadataReader)
ClassPathMapperScanner.scan
matchSelf(metadataReader)
引入方式2:通过自动配置的Condition没找到MapperScannerConfigurer引入
getBean(SomeMapper)
findCandidateComponents(basePackage)
foreach::getBean
寻找候选接口
2:definition.setBeanClass(this.mapperFactoryBeanClass)
根据过滤器判断是否是符合需求的候选者class如果你没有配置@MapperScan,则会默认扫描package下的所有带@Mapper注解的类,这个过滤就是在这里做的如果配置了@MapperScan,则这里就没有过滤@Mapper的过滤器
getObjectForBeanInstance来调用FactoryBean.getObject()
finishBeanFactoryInitialization
1:definition.getConstructorArgumentValues().addGenericArgumentValue(beanClassName)
3:definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE)
这里只讲Mybatis,所以这里注入了SqlSessionFactory和SqlSessionTemplate
processBeanDefinitions(beanDefinitions)
在上一步获取的候选class,在这一步进行判断,如果是接口则注册为beanDefinition
invokeBeanFactoryPostProcessors
MapperScannerConfigurer.postProcessBeanDefinitionRegistry
创建其FactoryBean
populateBean(ByType)
super.doScan(basePackages)
先创建FactoryBean,再通过getObject创建动态代理Bean实例
0 条评论
下一页