From e61cca74ca1b268b5ee5560a3dda298b1c06a450 Mon Sep 17 00:00:00 2001 From: Dmytro Nosan Date: Sun, 8 Jun 2025 12:29:57 +0300 Subject: [PATCH] Exclude ReactorAutoConfiguration from global lazy init This commits registers LazyInitializationExcludeFilter to exclude ReactorAutoConfiguration from global lazy init Signed-off-by: Dmytro Nosan --- .../reactor/ReactorAutoConfiguration.java | 7 +++++++ .../reactor/ReactorAutoConfigurationTests.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) 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 586dc3cdad4c..5dee07477d3b 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 @@ 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 39222efc78ab..d7ffd4192fa8 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.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; @@ -90,4 +91,19 @@ void shouldConfigurePropagationIfSetToAuto() { }); } + @Test + void shouldConfigurePropagationIfSetToAutoAndLazyInitializationIsEnabled() { + AtomicReference threadLocalValue = new AtomicReference<>(); + this.contextRunner.withPropertyValues("spring.reactor.context-propagation=AUTO") + .withInitializer((applicationContext) -> applicationContext + .addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor())) + .run((applicationContext) -> { + Mono.just("test") + .doOnNext((element) -> threadLocalValue.set(THREADLOCAL_VALUE.get())) + .contextWrite(Context.of(THREADLOCAL_KEY, "updated")) + .block(); + assertThat(threadLocalValue.get()).isEqualTo("updated"); + }); + } + }