源码注释环境
- jdk 1.8 +
- springboot 2.7.x
- idea 2022
- win 10
通过上文《自动配置原理解析一》我们知道了自动装配的方法,最终通过process获取需要自动装配的类,那个process是由谁调用的? 整个调用链又是如何? 本文将给你 答案。
AutoConfigurationImportSelector.class 调用链
-
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; } }