Skip to main content

SpringBoot源码解析之-AutoConfigureBefore、AutoConfigureOrder、AutoConfigureAfter

1. SpringBoot的类加载顺序注解

  • AutoConfigureBefore
  • AutoConfigureOrder
  • AutoConfigureAfter

通过这三个注解能够巧妙的使用排序。

2. 源码解析

在SpringBoot的加载主要通过注解 @EnableAutoConfiguration 来实现。在类 AutoConfigurationImportSelector 中有一个方法:

private List<String> sortAutoConfigurations(Set<String> configurations,AutoConfigurationMetadata autoConfigurationMetadata) {
return new AutoConfigurationSorter(getMetadataReaderFactory(), autoConfigurationMetadata)
.getInPriorityOrder(configurations);
}

通过上面的可以看出来主要是通过 AutoConfigurationSorter 来实现的。下面来看一下这个类:

	List<String> getInPriorityOrder(Collection<String> classNames) {
AutoConfigurationClasses classes = new AutoConfigurationClasses(this.metadataReaderFactory,
this.autoConfigurationMetadata, classNames);
List<String> orderedClassNames = new ArrayList<>(classNames);
// Initially sort alphabetically
Collections.sort(orderedClassNames);
// Then sort by order
orderedClassNames.sort((o1, o2) -> {
int i1 = classes.get(o1).getOrder();
int i2 = classes.get(o2).getOrder();
return Integer.compare(i1, i2);
});
// 处理这两个注解 @AutoConfigureBefore @AutoConfigureAfter
orderedClassNames = sortByAnnotation(classes, orderedClassNames);
return orderedClassNames;
}