springboot源码解读二-----(自动配置原理解析下)

本文详细阐述了SpringBoot自动配置的调用流程,起点是DeferredImportSelectorGrouping类的getImports方法,该方法触发对AutoConfigurationGroup的process方法的调用,进而处理并加载所有自动配置类。整个过程涉及到配置类的元数据和导入选择器,最终通过AutoConfigurationGroup的selectImports方法对自动装配类进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码注释环境

  • jdk 1.8 +
  • springboot 2.7.x
  • idea 2022
  • win 10

通过上文《自动配置原理解析一》我们知道了自动装配的方法,最终通过process获取需要自动装配的类,那个process是由谁调用的? 整个调用链又是如何? 本文将给你 答案。

AutoConfigurationImportSelector.class 调用链

  1. ConfigurationClassParser中有一个 内部静态类 : DeferredImportSelectorGrouping

    DeferredImportSelectorGrouping类(的 getImports 方法 )是整个自动装配调用链的开始。

    // 自动装配整个调用链的开始,从调用该类的 getImports 方法开始。
    private static class DeferredImportSelectorGrouping {
    		
    		// 这个 group 对应的就是 AutoConfigurationGroup 类。(AutoConfigurationGroup 也是实现了 DeferredImportSelector.Group )
    		private final DeferredImportSelector.Group group;
    
    		private final List<DeferredImportSelectorHolder> deferredImports = new ArrayList<>();
    
    		DeferredImportSelectorGrouping(Group group) {
    			this.group = group;
    		}
    
    		public void add(DeferredImportSelectorHolder deferredImport) {
    			this.deferredImports.add(deferredImport);
    		}
    
    		// getImports 自动配置调用链 的开始
    		/**
    		 * Return the imports defined by the group.
    		 * @return each import with its associated configuration class
    		 */
    		public Iterable<Group.Entry> getImports() {
    			for (DeferredImportSelectorHolder deferredImport : this.deferredImports) {
    				// 循环 调用  AutoConfigurationGroup 的 process 方法,装载所有的自动配置类
    				// deferredImport.getConfigurationClass().getMetadata() 注解元信息
    				// deferredImport.getImportSelector() 使用指定的DeferredImportSelector处理导入类的AnnotationMetadata。
    				this.group.process(deferredImport.getConfigurationClass().getMetadata(),
    						deferredImport.getImportSelector());
    			}
    			// 调用  AutoConfigurationGroup 的 selectImports方法,对 自动装配的类进行排序
    			return this.group.selectImports();
    		}
    
    		public Predicate<String> getCandidateFilter() {
    			Predicate<String> mergedFilter = DEFAULT_EXCLUSION_FILTER;
    			for (DeferredImportSelectorHolder deferredImport : this.deferredImports) {
    				Predicate<String> selectorFilter = deferredImport.getImportSelector().getExclusionFilter();
    				if (selectorFilter != null) {
    					mergedFilter = mergedFilter.or(selectorFilter);
    				}
    			}
    			return mergedFilter;
    		}
    	}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITzhongzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值