動機
最近, Javaのリフレクションについて知り, フレームワークなどの中身に使われているらしいということを知りました. リフレクションは簡単にカプセル化を破壊してしまうので多用は禁物ですが, いろいろ便利な使い方ができるようです. そこで, ひとつのアプリケーションとしてDIコンテナを自作してみることにしました.
DIとは
DIとはDependency injectionのことで, 依存性の注入です. これだけ聞いてもよくわからないですが, デザインパターンの一種のようです. Wikipediaによると,
依存性の注入(いぞんせいのちゅうにゅう、英: Dependency injection)とは、コンポーネント間の依存関係をプログラムのソースコードから排除するために、外部の設定ファイルなどでオブジェクトを注入できるようにするソフトウェアパターンである。
ということです.
Javaでいうと, インスタンスを使うためにはどこかにnew
と書いて実装クラスをインスタンス化する必要があります. その一方, 仕様変更等に柔軟に対応するため, 実装クラスをハードコーディングしたくないという考えもあります. このとき,
- 実装クラスを準備しておくから, クラスのリストを適宜検索, インスタンス化してフィールドに代入しておいてね ← DI
といったことができれば, これは解決できると思います. DIコンテナは, このような機能を持つオブジェクトです.
DIコンテナの実現
以下では「クラスのリストを検索しインスタンス化して, 適宜フィールドに代入する」という機能を対象として, それを実現するために必要な技術を考えます.
- 管理下のクラスをリスト化する機能
- インスタンスを代入するべきフィールドを判別する機能
- クラスの型を与えると, それにアサインできる具象クラスを検索する機能
- 具象クラスをインスタンス化する機能
が必要と考えられます. フィールドの判別と具象クラスのインスタンス化は, クラスファイルの内部構造に言及しているので, リフレクションが必要になってきます.
次回以降, コードを書きながら, 実装していこうと思います.
参考
以下のYoutube動画から刺激を受けて, やってみようと思いました.
https://www.youtube.com/watch?v=LR0nSDRR0Ac&t=4s