From 732011987d714c129543f23e43113380994d86c8 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 3 Jan 2017 15:04:31 -0800 Subject: [PATCH] Fix ManagementContextConfiguration @Order support Update `ManagementContextConfigurationsImportSelector` to instantiate classes so that order annotations are respected. Fixes gh-7814 --- ...ntContextConfigurationsImportSelector.java | 29 ++++++-- ...textConfigurationsImportSelectorTests.java | 68 +++++++++++++++++++ 2 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelectorTests.java diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java index a28c479e2b..3372cf8767 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.context.annotation.DeferredImportSelector; @@ -27,6 +28,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.Order; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.util.ClassUtils; /** * Selects configuration classes for the management context configuration. Entries are @@ -47,11 +49,26 @@ class ManagementContextConfigurationsImportSelector @Override public String[] selectImports(AnnotationMetadata metadata) { // Find all possible auto configuration classes, filtering duplicates - List factories = new ArrayList( - new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames( - ManagementContextConfiguration.class, this.classLoader))); - AnnotationAwareOrderComparator.sort(factories); - return factories.toArray(new String[0]); + List names = loadFactoryNames(); + Set> classes = new LinkedHashSet>(); + for (String factoryName : names) { + classes.add(ClassUtils.resolveClassName(factoryName, this.classLoader)); + } + return getSortedClassNames(new ArrayList>(classes)); + } + + protected List loadFactoryNames() { + return SpringFactoriesLoader + .loadFactoryNames(ManagementContextConfiguration.class, this.classLoader); + } + + private String[] getSortedClassNames(List> classes) { + AnnotationAwareOrderComparator.sort(classes); + List names = new ArrayList(); + for (Class sourceClass : classes) { + names.add(sourceClass.getName()); + } + return names.toArray(new String[names.size()]); } @Override diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelectorTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelectorTests.java new file mode 100644 index 0000000000..41a626db64 --- /dev/null +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelectorTests.java @@ -0,0 +1,68 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +import org.springframework.core.annotation.Order; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ManagementContextConfigurationsImportSelector}. + * + * @author Phillip Webb + */ +public class ManagementContextConfigurationsImportSelectorTests { + + @Test + public void selectImportsShouldOrderResult() throws Exception { + String[] imports = new TestManagementContextConfigurationsImportSelector() + .selectImports(null); + assertThat(imports).containsExactly(A.class.getName(), B.class.getName(), + C.class.getName()); + } + + private static class TestManagementContextConfigurationsImportSelector + extends ManagementContextConfigurationsImportSelector { + + @Override + protected List loadFactoryNames() { + return Arrays.asList(C.class.getName(), A.class.getName(), B.class.getName()); + } + + } + + @Order(1) + private static class A { + + } + + @Order(2) + private static class B { + + } + + @Order(3) + private static class C { + + } + +}