Mybatis是怎么將@Mapper的給掃描到Spring容器中的


  • 廢話不多說直接進入正題:

@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所以定義的都找到。第二次 調用實現PriorityOrderedBeanDefinitionRegistryPostProcessor 最后,調用所有其他實現了BeanDefinitionRegistryPostProcessor的bean,直到不再出現其他BeanDefinitionRegistryPostProcessor
  • 上附代碼
    • 第一個invokeBeanDefinitionRegistryPostProcessors 會觸發 ConfigurationClassPostProcessor#processConfigBeanDefinitions 這個類然后調用this.reader.loadBeanDefinitions(configClasses);觸發實現 ImportBeanDefinitionRegistrar 接口的 registerBeanDefinitions方法。這樣就完成了 MapperScannerConfigurer的注入
    • 第三 invokeBeanDefinitionRegistryPostProcessors 會循環到 MapperScannerConfigurer 然后觸發 postProcessBeanDefinitionRegistry 這個方法的循環掃到。執行 MapperScannerConfigurer#postProcessBeanDefinitionRegistry 方法進行掃描@Mapper


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM