RestTemplateBuilderに関する覚書
   2 min read

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 なら、あるbeanbuilderに設定したものが他所のbeanにも波及しちゃうじゃない。
  • けどResttemplateAutoConfigurationの Bean 定義部分どう見ても singleton-scope にしか見えない。何か自分の知らない記法(あるいは暗黙的解釈)がなにかまだあるのか? また 何か Spring マジックが発動しているのか…?

と思ってたけど、RestTemplateBuilderの状態設定メソッド(このへん)見て気づいた、 設定メソッドの中で new RestTemplateBuilder() やっとるんかーい!

インジェクションのタイミングじゃなくて builder にビルド設定を渡すタイミングで新しいインスタンスに成り代わってたのね…

関連リンク

余談

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