@MapperScan
- 在使用注解確認掃包范圍的時候
- 注解里的@Import(MapperScannerRegistrar.class)
- 引入了
MapperScannerRegistrar 這個類,然后引入了MapperScannerConfigurer 這個類。進行的掃描
- 因為該類實現了
ImportBeanDefinitionRegistrar
- 在SpringBoot啟動的時候 按照鏈路執行到方法
AbstractApplicationContext -> refresh ->invokeBeanFactoryPostProcessors -> PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors -> ConfigurationClassPostProcessor#processConfigBeanDefinitions->ImportBeanDefinitionRegistrar#registerBeanDefinitions
/**
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors方法
**/
/**
* 先執行 BeanDefinitionRegistryPostProcessor 的方法,然后執行 BeanFactoryPostProcessor 的方法
* @param beanFactory
* @param beanFactoryPostProcessors
*/
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// 定義一個 set 保存所有的 BeanFactoryPostProcessors
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<>();
// 如果當前 BeanFactory 為 BeanDefinitionRegistry
if (beanFactory instanceof BeanDefinitionRegistry) {
//....省略大部分
// 最終調用了 this.reader.loadBeanDefinitions 加載所有的 beanBeanDefinition 到工廠中
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
// 清空,以備下次使用
currentRegistryProcessors.clear();
//....省略大部分
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
while (reiterate) {
reiterate = false;
//....省略大部分
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
}
}
- 上方主要邏輯概括為。這個位置 其實是spring掃包環節。主要的就是把spring掃描范圍的bean給掃到
beanDefinitionMap 中去第一次主要是在ConfigurationClassPostProcessor所以定義的都找到。第二次 調用實現PriorityOrdered的BeanDefinitionRegistryPostProcessor 最后,調用所有其他實現了BeanDefinitionRegistryPostProcessor的bean,直到不再出現其他BeanDefinitionRegistryPostProcessor
- 上附代碼
- 第一個
invokeBeanDefinitionRegistryPostProcessors 會觸發 ConfigurationClassPostProcessor#processConfigBeanDefinitions 這個類然后調用this.reader.loadBeanDefinitions(configClasses);觸發實現 ImportBeanDefinitionRegistrar 接口的 registerBeanDefinitions方法。這樣就完成了 MapperScannerConfigurer的注入
- 第三
invokeBeanDefinitionRegistryPostProcessors 會循環到 MapperScannerConfigurer 然后觸發 postProcessBeanDefinitionRegistry 這個方法的循環掃到。執行 MapperScannerConfigurer#postProcessBeanDefinitionRegistry 方法進行掃描@Mapper