← Spring コース
43. DI コンテナを素の Java で作る
の芯は、素の Java の短いコードで書けます。欲しいを渡されたら、まず作成済みの置き場を見ます。無ければの引数の型をで読み、その型それぞれについて同じ手順を先に行い、そろった引数で生成して置き場に入れます。下のコードでは Clock が2か所から要求されますが、作られるのは1回だけです。
NestJS コースの「の考え方」では、文字列のトークンと作り方を Map に登録してから取り出しました。こちらには登録の行がありません。Java ではコンストラクタの引数がどのクラスかが に残り、実行時に getParameterTypes で読めるので、型そのものを鍵にして作り方をたどれるからです。依存を1つ足すときも、書き換えるのはコンストラクタの引数だけです。
このが扱えるのは、コンストラクタが1つで、引数がすべて目印付きの具象クラスである場合だけです。引数がだと、型の名前は読めても、どの実装を作るかは決められません。また A が B を、B が A を要求する循環では、置き場に入る前に再帰が続き になります。これは自作版の挙動で、 が循環をどう扱うかはここからは言えません。
点線の付いた語はタップすると説明が出ます。用語集を開く →
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つの具体例で確認します。
公式ドキュメントで詳しく ↗