From e2571a41bf2215cddcef9cfe0cccc42a70cec885 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 23 Jun 2025 14:58:47 +0200 Subject: [PATCH] Exclude ReactorAutoConfiguration from lazy initialization Closes gh-45846 --- .../reactor/ReactorAutoConfiguration.java | 7 +++++ .../ReactorAutoConfigurationTests.java | 28 ++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfiguration.java index 586dc3cdad4..5dee07477d3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfiguration.java @@ -18,10 +18,12 @@ package org.springframework.boot.autoconfigure.reactor; import reactor.core.publisher.Hooks; +import org.springframework.boot.LazyInitializationExcludeFilter; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; /** * {@link EnableAutoConfiguration Auto-configuration} for Reactor. @@ -40,4 +42,9 @@ public class ReactorAutoConfiguration { } } + @Bean + static LazyInitializationExcludeFilter reactorAutoConfigurationLazyInitializationExcludeFilter() { + return LazyInitializationExcludeFilter.forBeanTypes(ReactorAutoConfiguration.class); + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfigurationTests.java index 39222efc78a..f3990110fb4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/reactor/ReactorAutoConfigurationTests.java @@ -28,6 +28,7 @@ import reactor.core.publisher.Hooks; import reactor.core.publisher.Mono; import reactor.util.context.Context; +import org.springframework.boot.LazyInitializationBeanFactoryPostProcessor; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -81,13 +82,26 @@ class ReactorAutoConfigurationTests { @Test void shouldConfigurePropagationIfSetToAuto() { AtomicReference threadLocalValue = new AtomicReference<>(); - this.contextRunner.withPropertyValues("spring.reactor.context-propagation=auto").run((applicationContext) -> { - Mono.just("test") - .doOnNext((element) -> threadLocalValue.set(THREADLOCAL_VALUE.get())) - .contextWrite(Context.of(THREADLOCAL_KEY, "updated")) - .block(); - assertThat(threadLocalValue.get()).isEqualTo("updated"); - }); + this.contextRunner.withPropertyValues("spring.reactor.context-propagation=auto") + .run((applicationContext) -> assertThatPropagationIsWorking(threadLocalValue)); + } + + @Test + void shouldConfigurePropagationIfSetToAutoAndLazyInitializationIsEnabled() { + AtomicReference threadLocalValue = new AtomicReference<>(); + this.contextRunner + .withInitializer( + (context) -> context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor())) + .withPropertyValues("spring.reactor.context-propagation=auto") + .run((context) -> assertThatPropagationIsWorking(threadLocalValue)); + } + + private void assertThatPropagationIsWorking(AtomicReference threadLocalValue) { + Mono.just("test") + .doOnNext((element) -> threadLocalValue.set(THREADLOCAL_VALUE.get())) + .contextWrite(Context.of(THREADLOCAL_KEY, "updated")) + .block(); + assertThat(threadLocalValue.get()).isEqualTo("updated"); } }