SpringBoot 会对 spring.factories 中的 @Configuration 类进行排序。
注意:只是对所有 spring.factories 中的 @Configuratin 类排序(也就是通常使用的 starter 里面的配置)
排序使用的注解有:@AutoConfigureOrder、@AutoConfigureBefore、@AutoConfigureAfter
也就是说,@AutoConfigureOrder、@AutoConfigureBefore、@AutoConfigureAfter 这三个注解只对 spring.factories 中的 @Configuration 类生效
org.springframework.context.annotation.ConfigurationClassParser.DeferredImportSelectorGrouping#getImports()
1 public Iterable<Group.Entry> getImports() { 2 for (DeferredImportSelectorHolder deferredImport : this.deferredImports) { 3 // 1. 通过 ImportSelector 加载所有待解析的 @Configuration 类 4 this.group.process(deferredImport.getConfigurationClass().getMetadata(),deferredImport.getImportSelector()); 5 } 6 // 2. 获取排序过的 @Configuration 类 7 return this.group.selectImports(); 8 }
1. org.springframework.context.annotation.DeferredImportSelector.Group.Group#process() 1.1 org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry() 1.1.1 org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames() // 加载所有 spring.factories 中的类 2. org.springframework.context.annotation.DeferredImportSelector.Group#selectImports() 2.1 org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.AutoConfigurationGroup#sortAutoConfigurations() // 对 spring.factories 中的 @Configuration 类进行排序 2.1.1 org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames // 加载 spring.factories 文件
org.springframework.boot.autoconfigure.AutoConfigurationSorter#getInPriorityOrder()
1 List<String> getInPriorityOrder(Collection<String> classNames) { 2 AutoConfigurationClasses classes = new AutoConfigurationClasses(this.metadataReaderFactory, 3 this.autoConfigurationMetadata, classNames); 4 List<String> orderedClassNames = new ArrayList<>(classNames); 5 // Initially sort alphabetically 6 // 1. 按字母顺序排 7 Collections.sort(orderedClassNames); 8 // Then sort by order 9 // 2. 按 @AutoConfigureOrder 排 10 orderedClassNames.sort((o1, o2) -> { 11 int i1 = classes.get(o1).getOrder(); 12 int i2 = classes.get(o2).getOrder(); 13 return Integer.compare(i1, i2); 14 }); 15 // Then respect @AutoConfigureBefore @AutoConfigureAfter 16 // 3. 按 @AutoConfigureBefore @AutoConfigureAfter 排 17 orderedClassNames = sortByAnnotation(classes, orderedClassNames); 18 return orderedClassNames; 19 }