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
  • 相关阅读:
    javascript的字段值,私有变量,静态方法声明
    取得序列中某个点的范围边界
    使用wubi安装ubuntu11.04后无线网卡被禁用无法打开解决办法
    WEB前端性能优化
    jQuery的arrayLike
    在手机上安装BT5系统,没错就是破解无线密码的那个
    PHP在子类方法B调用父类的方法A时,不传参数时仍能得到方法B的名称
    讨厌的文本选区
    PHP遍历解析XML为一个数组
    “软工厂代码生成工具”的学习笔记
  • 原文地址:https://www.cnblogs.com/yunlongn/p/15634438.html
Copyright © 2011-2022 走看看