From 1d1a1f351c85d012c04d63dcc571078ab66e3fc6 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Fri, 3 Jul 2026 09:35:30 +0800 Subject: [PATCH] Inject Customizers as ObjectProvider to keep consistency Signed-off-by: Yanming Zhou --- .../autoconfigure/GsonAutoConfiguration.java | 7 +-- .../JacksonAutoConfiguration.java | 52 ++++++------------- .../Jackson2AutoConfiguration.java | 13 ++--- ...inxSerializationJsonAutoConfiguration.java | 7 +-- .../autoconfigure/BraveAutoConfiguration.java | 13 ++--- .../RestTestClientTestAutoConfiguration.java | 7 ++- .../WebTestClientAutoConfiguration.java | 7 +-- 7 files changed, 40 insertions(+), 66 deletions(-) diff --git a/module/spring-boot-gson/src/main/java/org/springframework/boot/gson/autoconfigure/GsonAutoConfiguration.java b/module/spring-boot-gson/src/main/java/org/springframework/boot/gson/autoconfigure/GsonAutoConfiguration.java index dc2a57abf727..d2f0a5dbac73 100644 --- a/module/spring-boot-gson/src/main/java/org/springframework/boot/gson/autoconfigure/GsonAutoConfiguration.java +++ b/module/spring-boot-gson/src/main/java/org/springframework/boot/gson/autoconfigure/GsonAutoConfiguration.java @@ -16,13 +16,13 @@ package org.springframework.boot.gson.autoconfigure; -import java.util.List; import java.util.function.Consumer; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.Strictness; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -38,6 +38,7 @@ * * @author David Liu * @author Ivan Golovko + * @author Yanming Zhou * @since 4.0.0 */ @AutoConfiguration @@ -47,9 +48,9 @@ public final class GsonAutoConfiguration { @Bean @ConditionalOnMissingBean - GsonBuilder gsonBuilder(List customizers) { + GsonBuilder gsonBuilder(ObjectProvider customizers) { GsonBuilder builder = new GsonBuilder(); - customizers.forEach((c) -> c.customize(builder)); + customizers.orderedStream().forEach((c) -> c.customize(builder)); return builder; } diff --git a/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java b/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java index a1f3a30a9a83..bb2d2184a6ff 100644 --- a/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java +++ b/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java @@ -100,6 +100,7 @@ * @author Phillip Webb * @author Eddú Meléndez * @author Ralf Ueberfuhr + * @author Yanming Zhou * @since 4.0.0 */ @AutoConfiguration @@ -113,29 +114,22 @@ JacksonComponentModule jsonComponentModule() { @Bean @ConditionalOnMissingBean - JsonFactory jsonFactory(List customizers) { + JsonFactory jsonFactory(ObjectProvider customizers) { JsonFactoryBuilder builder = JsonFactory.builder(); - for (JsonFactoryBuilderCustomizer customizer : customizers) { - customizer.customize(builder); - } + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); } @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @ConditionalOnMissingBean - JsonMapper.Builder jsonMapperBuilder(List customizers, JsonFactory jsonFactory) { + JsonMapper.Builder jsonMapperBuilder(ObjectProvider customizers, + JsonFactory jsonFactory) { JsonMapper.Builder builder = JsonMapper.builder(jsonFactory); - customize(builder, customizers); + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder; } - private void customize(JsonMapper.Builder builder, List customizers) { - for (JsonMapperBuilderCustomizer customizer : customizers) { - customizer.customize(builder); - } - } - @Bean @Primary @ConditionalOnMissingBean @@ -250,29 +244,22 @@ static class CborConfiguration { @Bean @ConditionalOnMissingBean - CBORFactory cborFactory(List customizers) { + CBORFactory cborFactory(ObjectProvider customizers) { CBORFactoryBuilder builder = CBORFactory.builder(); - for (CborFactoryBuilderCustomizer customizer : customizers) { - customizer.customize(builder); - } + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); } @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @ConditionalOnMissingBean - CBORMapper.Builder cborMapperBuilder(CBORFactory factory, List customizers) { + CBORMapper.Builder cborMapperBuilder(CBORFactory factory, + ObjectProvider customizers) { CBORMapper.Builder builder = CBORMapper.builder(factory); - customize(builder, customizers); + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder; } - private void customize(CBORMapper.Builder builder, List customizers) { - for (CborMapperBuilderCustomizer customizer : customizers) { - customizer.customize(builder); - } - } - @Bean @ConditionalOnMissingBean CBORMapper cborMapper(CBORMapper.Builder builder) { @@ -340,29 +327,22 @@ static class XmlConfiguration { @Bean @ConditionalOnMissingBean - XmlFactory xmlFactory(List customizers) { + XmlFactory xmlFactory(ObjectProvider customizers) { XmlFactoryBuilder builder = XmlFactory.builder(); - for (XmlFactoryBuilderCustomizer customizer : customizers) { - customizer.customize(builder); - } + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); } @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @ConditionalOnMissingBean - XmlMapper.Builder xmlMapperBuilder(XmlFactory xmlFactory, List customizers) { + XmlMapper.Builder xmlMapperBuilder(XmlFactory xmlFactory, + ObjectProvider customizers) { XmlMapper.Builder builder = XmlMapper.builder(xmlFactory); - customize(builder, customizers); + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder; } - private void customize(XmlMapper.Builder builder, List customizers) { - for (XmlMapperBuilderCustomizer customizer : customizers) { - customizer.customize(builder); - } - } - @Bean @ConditionalOnMissingBean XmlMapper xmlMapper(XmlMapper.Builder builder) { diff --git a/module/spring-boot-jackson2/src/main/java/org/springframework/boot/jackson2/autoconfigure/Jackson2AutoConfiguration.java b/module/spring-boot-jackson2/src/main/java/org/springframework/boot/jackson2/autoconfigure/Jackson2AutoConfiguration.java index 138860f95dfa..6c10405e9a74 100644 --- a/module/spring-boot-jackson2/src/main/java/org/springframework/boot/jackson2/autoconfigure/Jackson2AutoConfiguration.java +++ b/module/spring-boot-jackson2/src/main/java/org/springframework/boot/jackson2/autoconfigure/Jackson2AutoConfiguration.java @@ -82,6 +82,7 @@ * @author Phillip Webb * @author Eddú Meléndez * @author Ralf Ueberfuhr + * @author Yanming Zhou * @since 4.0.0 * @deprecated since 4.0.0 for removal in 4.3.0 in favor of Jackson 3. */ @@ -157,20 +158,14 @@ static class JacksonObjectMapperBuilderConfiguration { @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @ConditionalOnMissingBean org.springframework.http.converter.json.Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder( - ApplicationContext applicationContext, List customizers) { + ApplicationContext applicationContext, + ObjectProvider customizers) { org.springframework.http.converter.json.Jackson2ObjectMapperBuilder builder = new org.springframework.http.converter.json.Jackson2ObjectMapperBuilder(); builder.applicationContext(applicationContext); - customize(builder, customizers); + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder; } - private void customize(org.springframework.http.converter.json.Jackson2ObjectMapperBuilder builder, - List customizers) { - for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) { - customizer.customize(builder); - } - } - } @Configuration(proxyBeanMethods = false) diff --git a/module/spring-boot-kotlinx-serialization-json/src/main/java/org/springframework/boot/kotlinx/serialization/json/autoconfigure/KotlinxSerializationJsonAutoConfiguration.java b/module/spring-boot-kotlinx-serialization-json/src/main/java/org/springframework/boot/kotlinx/serialization/json/autoconfigure/KotlinxSerializationJsonAutoConfiguration.java index 7350b29458cc..50ce4206559d 100644 --- a/module/spring-boot-kotlinx-serialization-json/src/main/java/org/springframework/boot/kotlinx/serialization/json/autoconfigure/KotlinxSerializationJsonAutoConfiguration.java +++ b/module/spring-boot-kotlinx-serialization-json/src/main/java/org/springframework/boot/kotlinx/serialization/json/autoconfigure/KotlinxSerializationJsonAutoConfiguration.java @@ -16,7 +16,6 @@ package org.springframework.boot.kotlinx.serialization.json.autoconfigure; -import java.util.List; import java.util.function.Consumer; import kotlin.Unit; @@ -26,6 +25,7 @@ import kotlinx.serialization.json.JsonKt; import kotlinx.serialization.json.JsonNamingStrategy; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -39,6 +39,7 @@ * {@link EnableAutoConfiguration Auto-configuration} for Kotlinx Serialization JSON. * * @author Dmitry Sulman + * @author Yanming Zhou * @since 4.0.0 */ @AutoConfiguration @@ -48,9 +49,9 @@ public final class KotlinxSerializationJsonAutoConfiguration { @Bean @ConditionalOnMissingBean - Json kotlinSerializationJson(List customizers) { + Json kotlinSerializationJson(ObjectProvider customizers) { Function1 builderAction = (jsonBuilder) -> { - customizers.forEach((c) -> c.customize(jsonBuilder)); + customizers.orderedStream().forEach((customizer) -> customizer.customize(jsonBuilder)); return Unit.INSTANCE; }; return JsonKt.Json(Json.Default, builderAction); diff --git a/module/spring-boot-micrometer-tracing-brave/src/main/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/BraveAutoConfiguration.java b/module/spring-boot-micrometer-tracing-brave/src/main/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/BraveAutoConfiguration.java index 2ef97d87ceb6..38b09214ca15 100644 --- a/module/spring-boot-micrometer-tracing-brave/src/main/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/BraveAutoConfiguration.java +++ b/module/spring-boot-micrometer-tracing-brave/src/main/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/BraveAutoConfiguration.java @@ -64,6 +64,7 @@ * @author Moritz Halbritter * @author Marcin Grzejszczak * @author Jonatan Ivanov + * @author Yanming Zhou * @since 4.0.0 */ @AutoConfiguration(before = { MicrometerTracingAutoConfiguration.class, NoopTracerAutoConfiguration.class }) @@ -100,7 +101,7 @@ CompositeSpanHandler compositeSpanHandler(ObjectProvider @Bean @ConditionalOnMissingBean Tracing braveTracing(Environment environment, List spanHandlers, - List tracingCustomizers, CurrentTraceContext currentTraceContext, + ObjectProvider tracingCustomizers, CurrentTraceContext currentTraceContext, Factory propagationFactory, Sampler sampler) { if (this.braveTracingProperties.isSpanJoiningSupported()) { if (this.tracingProperties.getPropagation().getType() != null @@ -128,9 +129,7 @@ Tracing braveTracing(Environment environment, List spanHandlers, .sampler(sampler) .localServiceName(applicationName); spanHandlers.forEach(builder::addSpanHandler); - for (TracingCustomizer tracingCustomizer : tracingCustomizers) { - tracingCustomizer.customize(builder); - } + tracingCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); } @@ -143,12 +142,10 @@ brave.Tracer braveTracer(Tracing tracing) { @Bean @ConditionalOnMissingBean CurrentTraceContext braveCurrentTraceContext(List scopeDecorators, - List currentTraceContextCustomizers) { + ObjectProvider currentTraceContextCustomizers) { ThreadLocalCurrentTraceContext.Builder builder = ThreadLocalCurrentTraceContext.newBuilder(); scopeDecorators.forEach(builder::addScopeDecorator); - for (CurrentTraceContextCustomizer currentTraceContextCustomizer : currentTraceContextCustomizers) { - currentTraceContextCustomizer.customize(builder); - } + currentTraceContextCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); } diff --git a/module/spring-boot-resttestclient/src/main/java/org/springframework/boot/resttestclient/autoconfigure/RestTestClientTestAutoConfiguration.java b/module/spring-boot-resttestclient/src/main/java/org/springframework/boot/resttestclient/autoconfigure/RestTestClientTestAutoConfiguration.java index c8c11b49b726..72a7c9c72396 100644 --- a/module/spring-boot-resttestclient/src/main/java/org/springframework/boot/resttestclient/autoconfigure/RestTestClientTestAutoConfiguration.java +++ b/module/spring-boot-resttestclient/src/main/java/org/springframework/boot/resttestclient/autoconfigure/RestTestClientTestAutoConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.boot.resttestclient.autoconfigure; -import java.util.List; - import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -38,6 +36,7 @@ * @author Stephane Nicoll * @author Andy Wilkinson * @author Phillip Webb + * @author Yanming Zhou * @see AutoConfigureRestTestClient */ @AutoConfiguration @@ -53,9 +52,9 @@ SpringBootRestTestClientBuilderCustomizer springBootRestTestClientBuilderCustomi @Bean @ConditionalOnMissingBean RestTestClient restTestClient(WebApplicationContext applicationContext, - List customizers) { + ObjectProvider customizers) { RestTestClient.Builder builder = getBuilder(applicationContext); - customizers.forEach((customizer) -> customizer.customize(builder)); + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); } diff --git a/module/spring-boot-webtestclient/src/main/java/org/springframework/boot/webtestclient/autoconfigure/WebTestClientAutoConfiguration.java b/module/spring-boot-webtestclient/src/main/java/org/springframework/boot/webtestclient/autoconfigure/WebTestClientAutoConfiguration.java index 494483af17ba..59a82840cc81 100644 --- a/module/spring-boot-webtestclient/src/main/java/org/springframework/boot/webtestclient/autoconfigure/WebTestClientAutoConfiguration.java +++ b/module/spring-boot-webtestclient/src/main/java/org/springframework/boot/webtestclient/autoconfigure/WebTestClientAutoConfiguration.java @@ -45,6 +45,7 @@ * @author Stephane Nicoll * @author Andy Wilkinson * @author Phillip Webb + * @author Yanming Zhou * @since 4.0.0 */ @AutoConfiguration(after = CodecsAutoConfiguration.class) @@ -63,10 +64,10 @@ SpringBootWebTestClientBuilderCustomizer springBootWebTestClientBuilderCustomize @Bean @ConditionalOnMissingBean - WebTestClient webTestClient(ApplicationContext applicationContext, List customizers, - List configurers) { + WebTestClient webTestClient(ApplicationContext applicationContext, + ObjectProvider customizers, List configurers) { WebTestClient.Builder builder = getBuilder(applicationContext, configurers); - customizers.forEach((customizer) -> customizer.customize(builder)); + customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); return builder.build(); }