From 276b2888910fa6763a451d14f05a5be49e0bffd0 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 30 Nov 2022 12:34:09 +0000 Subject: [PATCH] Prevent repeat configuration of DB init bean dependencies Fixes gh-33374 --- ...aseInitializationDependencyConfigurer.java | 4 +++ ...itializationDependencyConfigurerTests.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurer.java index 5d412241875f..df2bb990d86e 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurer.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Set; +import org.springframework.aot.AotDetector; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanDefinition; @@ -95,6 +96,9 @@ public int getOrder() { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { + if (AotDetector.useGeneratedArtifacts()) { + return; + } InitializerBeanNames initializerBeanNames = detectInitializerBeanNames(beanFactory); if (initializerBeanNames.isEmpty()) { return; diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java index 5bd5b48ec5c7..9b6eb15ad088 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java @@ -169,6 +169,35 @@ void whenDependenciesAreConfiguredDetectedDatabaseInitializersAreInitializedInCo }); } + @Test + void whenInAnAotProcessedContextDependsOnDatabaseInitializationPostProcessorDoesNothing() { + withAotEnabled(() -> { + BeanDefinition alpha = BeanDefinitionBuilder.rootBeanDefinition(String.class).getBeanDefinition(); + BeanDefinition bravo = BeanDefinitionBuilder.rootBeanDefinition(String.class).getBeanDefinition(); + performDetection(Arrays.asList(MockDatabaseInitializerDetector.class, + MockedDependsOnDatabaseInitializationDetector.class), (context) -> { + context.registerBeanDefinition("alpha", alpha); + context.registerBeanDefinition("bravo", bravo); + context.register(DependencyConfigurerConfiguration.class); + context.refresh(); + assertThat(alpha.getAttribute(DatabaseInitializerDetector.class.getName())).isNull(); + assertThat(bravo.getAttribute(DatabaseInitializerDetector.class.getName())).isNull(); + then(MockDatabaseInitializerDetector.instance).shouldHaveNoInteractions(); + assertThat(bravo.getDependsOn()).isNull(); + }); + }); + } + + private void withAotEnabled(Runnable action) { + System.setProperty("spring.aot.enabled", "true"); + try { + action.run(); + } + finally { + System.clearProperty("spring.aot.enabled"); + } + } + private void performDetection(Collection> detectors, Consumer contextCallback) { DetectorSpringFactoriesClassLoader detectorSpringFactories = new DetectorSpringFactoriesClassLoader(this.temp);