Dev Study
← Spring コース

43. DI コンテナを素の Java で作る

の芯は、素の Java の短いコードで書けます。欲しいを渡されたら、まず作成済みの置き場を見ます。無ければの引数の型をで読み、その型それぞれについて同じ手順を先に行い、そろった引数で生成して置き場に入れます。下のコードでは Clock が2か所から要求されますが、作られるのは1回だけです。

NestJS コースの「の考え方」では、文字列のトークンと作り方を Map に登録してから取り出しました。こちらには登録の行がありません。Java ではコンストラクタの引数がどのクラスかが に残り、実行時に getParameterTypes で読めるので、型そのものを鍵にして作り方をたどれるからです。依存を1つ足すときも、書き換えるのはコンストラクタの引数だけです。

このが扱えるのは、コンストラクタが1つで、引数がすべて目印付きの具象クラスである場合だけです。引数がだと、型の名前は読めても、どの実装を作るかは決められません。また A が B を、B が A を要求する循環では、置き場に入る前に再帰が続き になります。これは自作版の挙動で、 が循環をどう扱うかはここからは言えません。

点線の付いた語はタップすると説明が出ます。用語集を開く →

get(UserService.class) の中で起きること(上のコードの出力をもとに作図)
get(UserService.class)置き場に無い → コンストラクタの引数の型を読む
UserRepository と Clock が要る
引数の型それぞれについて、同じ get を先に呼ぶ
get(UserRepository.class)置き場に無い → Clock が要る
さらに奥へ
get(Clock.class)引数なし。ここで初めて生成して置き場へ
奥から順に生成が済み、戻ってくる(UserService の2つ目の引数の Clock は reuse)
置き場(型 → インスタンス)Clock・UserRepository・UserService が1つずつ
  • ・どのクラスが何を必要とするかは、どこにも登録していません。コンストラクタの引数の型を .class から読んでいます
  • ・置き場に入るのはコンストラクタが返った後です。循環があると、入る前に同じ get が呼ばれ続けます

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Java

図やコードに出てくる用語(タップで説明)

サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗