zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    让Editplus自动格式化js、css、html。。。
    超强JavaScript编辑器WebStorm上安装zenCoding
    魔哥Css:背景色透明,内容不透明之终极方法!兼容(不支持ie6)。
    支持二次开发的Zigbee模块(SNAP技术)
    XI Monitor Analysis
    SAP 增强方式
    查找业务对应的IDOC类型(HELP)
    POS DM 学习URL
    IDOC MSGRN
    XI 安装MS SQLSERVER JDBC 驱动
  • 原文地址:https://www.cnblogs.com/yunlongn/p/15634438.html
Copyright © 2011-2022 走看看