https://docs.spring.io/spring-boot/api/java/org/springframework/boot/autoconfigure/web/reactive/function/client/WebClientAutoConfiguration.html にある通り、WebClient.Builder
のbean定義には@Scope("prototype")
が付与されている。このため、injectionの度に毎回異なるインスタンスが生成される。WebClient.Builder
自体はmutableだが、異なる設定のWebClient
を生成する場合、prototypeなのでそのinjectionしたbuidlerを使えば良い。
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
public WebClient.Builder webClientBuilder(// 省略
ソースコードなど
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.3'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
動作確認。二つの異なるserviceにWebClient.Builder
をinjectionしてみる。
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class SampleService1 {
public SampleService1(WebClient.Builder builder) {
System.out.println("service1:" + builder);
// 以下省略
@Service
public class SampleService2 {
public SampleService2(WebClient.Builder builder) {
System.out.println("service2:" + builder);
// 以下省略
以下は出力例。異なるインスタンスな事が分かる。
service1:org.springframework.web.reactive.function.client.DefaultWebClientBuilder@49faf066
service2:org.springframework.web.reactive.function.client.DefaultWebClientBuilder@455c1d8c
単一クラスで複数のbuilderが欲しい場合は単に引数に並べれば良い。
@Service
public class SampleService1 {
public SampleService1(WebClient.Builder builder, WebClient.Builder builder2) {
System.out.println("service1-1:" + builder);
System.out.println("service1-2:" + builder2);
// 以下省略
以下は出力例。
service1-1:org.springframework.web.reactive.function.client.DefaultWebClientBuilder@7fdab70c
service1-2:org.springframework.web.reactive.function.client.DefaultWebClientBuilder@25ad4f71