diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilter.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilter.java index efc4ea7fa5..a083b9b26e 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilter.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilter.java @@ -27,8 +27,7 @@ import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; /** - * A {@link TypeFilter} implementation that matches registered auto-configuration - * classes. + * A {@link TypeFilter} implementation that matches registered auto-configuration classes. * * @author Stephane Nicoll * @since 1.5.0 @@ -37,7 +36,7 @@ public class AutoConfigurationExcludeFilter implements TypeFilter, BeanClassLoad private ClassLoader beanClassLoader; - private List candidateAutoConfigurations; + private volatile List autoConfigurations; @Override public void setBeanClassLoader(ClassLoader beanClassLoader) { @@ -50,22 +49,22 @@ public class AutoConfigurationExcludeFilter implements TypeFilter, BeanClassLoad return isConfiguration(metadataReader) && isAutoConfiguration(metadataReader); } - protected List getCandidateAutoConfigurations() { - if (this.candidateAutoConfigurations == null) { - this.candidateAutoConfigurations = SpringFactoriesLoader.loadFactoryNames( - EnableAutoConfiguration.class, this.beanClassLoader); - } - return this.candidateAutoConfigurations; - } - private boolean isConfiguration(MetadataReader metadataReader) { return metadataReader.getAnnotationMetadata() .isAnnotated(Configuration.class.getName()); } private boolean isAutoConfiguration(MetadataReader metadataReader) { - return getCandidateAutoConfigurations().contains( - metadataReader.getClassMetadata().getClassName()); + return getAutoConfigurations() + .contains(metadataReader.getClassMetadata().getClassName()); + } + + protected List getAutoConfigurations() { + if (this.autoConfigurations == null) { + this.autoConfigurations = SpringFactoriesLoader.loadFactoryNames( + EnableAutoConfiguration.class, this.beanClassLoader); + } + return this.autoConfigurations; } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilterTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilterTests.java index 411f10b048..dde957cb25 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilterTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilterTests.java @@ -41,6 +41,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class AutoConfigurationExcludeFilterTests { + private static final Class FILTERED = ExampleFilteredAutoConfiguration.class; + @Rule public ExpectedException thrown = ExpectedException.none(); @@ -59,10 +61,9 @@ public class AutoConfigurationExcludeFilterTests { assertThat(this.context.getBeansOfType(String.class)).hasSize(1); assertThat(this.context.getBean(String.class)).isEqualTo("test"); this.thrown.expect(NoSuchBeanDefinitionException.class); - this.context.getBean(ExampleFilteredAutoConfiguration.class); + this.context.getBean(FILTERED); } - @Configuration @ComponentScan(basePackageClasses = ExampleConfiguration.class, excludeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TestAutoConfigurationExcludeFilter.class)) static class Config { @@ -71,10 +72,12 @@ public class AutoConfigurationExcludeFilterTests { static class TestAutoConfigurationExcludeFilter extends AutoConfigurationExcludeFilter { + @Override - protected List getCandidateAutoConfigurations() { - return Collections.singletonList(ExampleFilteredAutoConfiguration.class.getName()); + protected List getAutoConfigurations() { + return Collections.singletonList(FILTERED.getName()); } + } }