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 は前者を許してはくれないということか。