@Configuration 配置类排序

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 }

 

上一篇:php – 域对象工厂是什么样的?


下一篇:SpringBoot-1.简介,第一个简单程序,结构分析