diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java index bd6054c6f44..6de03997498 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java +++ b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java @@ -77,38 +77,34 @@ class AutoConfigurationSorter { return Integer.compare(i1, i2); }); // Then respect @AutoConfigureBefore @AutoConfigureAfter - orderedClassNames = sortByAnnotation(classes, orderedClassNames); + orderedClassNames = sortByAnnotation(new LinkedHashSet<>(orderedClassNames), classes); return orderedClassNames; } - private List sortByAnnotation(AutoConfigurationClasses classes, List classNames) { - Set requestedClassNames = new LinkedHashSet<>(classNames); + private List sortByAnnotation(Set classNames, AutoConfigurationClasses classes) { Map sortOrder = new LinkedHashMap<>(); - for (String className : classNames) { - sortOrder.putIfAbsent(className, sortOrder.size()); - } - for (String className : classes.getAllNames()) { - sortOrder.putIfAbsent(className, sortOrder.size()); - } + classNames.forEach((className) -> sortOrder.putIfAbsent(className, sortOrder.size())); + classes.getAllNames().forEach((className) -> sortOrder.putIfAbsent(className, sortOrder.size())); Set sorted = new LinkedHashSet<>(); Set processing = new LinkedHashSet<>(); for (String className : sortOrder.keySet()) { - if (!sorted.contains(className)) { - doSortByAfterAnnotation(classes, sortOrder, sorted, processing, className); - } + doSortByAfterAnnotation(classes, sortOrder, sorted, processing, className); } - sorted.retainAll(requestedClassNames); + sorted.retainAll(classNames); return new ArrayList<>(sorted); } private void doSortByAfterAnnotation(AutoConfigurationClasses classes, Map sortOrder, Set sorted, Set processing, String current) { + if (sorted.contains(current)) { + return; + } processing.add(current); Set afters = new TreeSet<>(Comparator.comparingInt((String name) -> sortOrder.getOrDefault(name, -1))); afters.addAll(classes.getClassesRequestedAfter(current)); for (String after : afters) { checkForCycles(processing, current, after); - if (!sorted.contains(after) && sortOrder.containsKey(after)) { + if (sortOrder.containsKey(after)) { doSortByAfterAnnotation(classes, sortOrder, sorted, processing, after); } }