前提: 首先要了解ioc的步骤,先解析,定义beanDefiniton, 在调用工厂类getObject
1.@MapperScan basePackages 指定包路径
2. @Import(MapperScannerRegistrar.class)
MapperScannerRegistrar 实现了ImportBeanDefinitionRegistrar 并重写了方法registerBeanDefinitions(); public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware { }
registerBeanDefinitions()中将 MapperScannerConfigurer 添加配置参数,并注入到了BeanDefinition容器中
3 MapperScannerConfigurer 实现了BeanDefinitionRegistryPostProcessor
4 ClassPathMapperScanner 将 mapper 生成 BeanDefinitionHolder 添加到容器中。
5 ,当执行ioc 容器的bean 加载时, singletonObject = singletonFactory.getObject();
这是 MapperFactoryBean 回去调用 getObject()重写的方法
public T getObject() throws Exception {
return getSqlSession().getMapper(this.mapperInterface);
}
返回jdk 代理对象
6 .那么MapperScannerConfigurer 什么时候被调用呢?
启动类springApplication
最终AbstractApplicationContext 类下的refresh
PostProcessorRegistrationDelegate 类 invokeBeanFactoryPostProcessors方法
加载实现BeanDefinitionRegistryPostProcessor.class 的类型 , 便将MapperScannerConfigurer 的加载出来。 最后调用 invokeBeanDefinitionRegistryPostProcessors方法 , 调用了MapperScannerConfigurer容器中。