RestTemplateBuilderに関する覚書
RestTemplateBuilder
- RestTemplate は Spring Framework(spring-web)だけれども RestTemplateBuilder は Spring Boot。
- Java の世界の
なんちゃらBuilder
(StringBuilderとか Lombok のBuilder
アノテーションとか、ざっくり総称で Effective Java 版 Builder とでも呼ぶべきか)の使い方は、「まずbuilder
のインスタンスを生成します」から始まるのでRestTempalteBuilder
もそれだと思っていた。- つまり、このクラスインスタンスは Spring Boot のデフォルト状態でインジェクション可能だけれども、このインジェクションされた
RestTempalteBuilder
インスタンスのスコープは(Spring のデフォルトであるところの)singleton-scope ではない と思っていた。- だって
builder
インスタンスが singleton-scope なら、あるbean
でbuilder
に設定したものが他所のbean
にも波及しちゃうじゃない。
- だって
- つまり、このクラスインスタンスは Spring Boot のデフォルト状態でインジェクション可能だけれども、このインジェクションされた
- けど
ResttemplateAutoConfiguration
の Bean 定義部分どう見ても singleton-scope にしか見えない。何か自分の知らない記法(あるいは暗黙的解釈)がなにかまだあるのか? また 何か Spring マジックが発動しているのか…?
と思ってたけど、RestTemplateBuilder
の状態設定メソッド(このへん)見て気づいた、 設定メソッドの中で new RestTemplateBuilder()
やっとるんかーい!
インジェクションのタイミングじゃなくて builder
にビルド設定を渡すタイミングで新しいインスタンスに成り代わってたのね…
関連リンク
- 14. Calling REST Services with RestTemplate - Spring Boot Features
余談
Effective Java 版 Builder だとbuilder
に情報を設定する際に、builder
インスタンスを使い回すもよし
var builder = new StringBuilder();
builder.append("Hello, ");
builder.append("world!");
builder.toString();
戻り値を使ってメソッドチェーンしてもよし
new StringBuilder().append("Hello, ").appned("world!").toString();
だけれども、 RestTemplateBuilder
は前者を許してはくれないということか。