diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java index a51ae62893..d0e0b2bd8c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java @@ -233,13 +233,23 @@ public class AutoConfigurationImportSelector implements DeferredImportSelector, return excluded; } - private List getExcludeAutoConfigurationsProperty() { - if (getEnvironment() instanceof ConfigurableEnvironment) { - Binder binder = Binder.get(getEnvironment()); + /** + * Returns the auto-configurations excluded by the + * {@code spring.autoconfigure.exclude} property. + * @return excluded auto-configurations + * @since 2.3.2 + */ + protected List getExcludeAutoConfigurationsProperty() { + Environment environment = getEnvironment(); + if (environment == null) { + return Collections.emptyList(); + } + if (environment instanceof ConfigurableEnvironment) { + Binder binder = Binder.get(environment); return binder.bind(PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE, String[].class).map(Arrays::asList) .orElse(Collections.emptyList()); } - String[] excludes = getEnvironment().getProperty(PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE, String[].class); + String[] excludes = environment.getProperty(PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE, String[].class); return (excludes != null) ? Arrays.asList(excludes) : Collections.emptyList(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java index ec52a64a8a..1b57a151ff 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -118,6 +118,7 @@ class ImportAutoConfigurationImportSelector extends AutoConfigurationImportSelec } } } + exclusions.addAll(getExcludeAutoConfigurationsProperty()); return exclusions; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java index 455ad596ce..1946622572 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java @@ -25,22 +25,19 @@ import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration; import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration; import org.springframework.core.annotation.AliasFor; -import org.springframework.core.env.Environment; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.classreading.SimpleMetadataReaderFactory; +import org.springframework.mock.env.MockEnvironment; import org.springframework.util.ClassUtils; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verifyNoInteractions; /** * Tests for {@link ImportAutoConfigurationImportSelector}. @@ -54,12 +51,10 @@ class ImportAutoConfigurationImportSelectorTests { private final ConfigurableListableBeanFactory beanFactory = new DefaultListableBeanFactory(); - @Mock - private Environment environment; + private final MockEnvironment environment = new MockEnvironment(); @BeforeEach void setup() { - MockitoAnnotations.initMocks(this); this.importSelector.setBeanFactory(this.beanFactory); this.importSelector.setEnvironment(this.environment); this.importSelector.setResourceLoader(new DefaultResourceLoader()); @@ -80,10 +75,11 @@ class ImportAutoConfigurationImportSelectorTests { } @Test - void propertyExclusionsAreNotApplied() throws Exception { - AnnotationMetadata annotationMetadata = getAnnotationMetadata(ImportFreeMarker.class); - this.importSelector.selectImports(annotationMetadata); - verifyNoInteractions(this.environment); + void propertyExclusionsAreApplied() throws IOException { + this.environment.setProperty("spring.autoconfigure.exclude", FreeMarkerAutoConfiguration.class.getName()); + AnnotationMetadata annotationMetadata = getAnnotationMetadata(MultipleImports.class); + String[] imports = this.importSelector.selectImports(annotationMetadata); + assertThat(imports).containsExactly(ThymeleafAutoConfiguration.class.getName()); } @Test @@ -288,7 +284,9 @@ class ImportAutoConfigurationImportSelectorTests { @interface MetaImportAutoConfiguration { @AliasFor(annotation = ImportAutoConfiguration.class) - Class[] exclude() default {}; + Class[] exclude() default { + + }; } @@ -308,7 +306,9 @@ class ImportAutoConfigurationImportSelectorTests { @interface SelfAnnotating { @AliasFor(annotation = ImportAutoConfiguration.class, attribute = "exclude") - Class[] excludeAutoConfiguration() default {}; + Class[] excludeAutoConfiguration() default { + + }; }