DIについての説明自体はいろんなところでされていますが、少ししっくりきたのでDIの概要イメージの備忘録
DIとは
DIは「Dependency Injection (依存性注入) 」と言われる考え方になります。
あるクラスが別のクラスをインスタンス変数に持つなどして利用 (依存) している場合に、インスタンス変数の設定 (依存性の解決) をクラス内で行うのではなく、外部から設定 (注入) するというデザインパターンの一つです。
依存性とは言いますが、オブジェクトで考えとよいみたいです。
ちなみにSpringにおけるDIコンテナはDIで作られたインスタンスを格納する入れ物という考え方で問題ないみたいです。
Springに限らずstrutsなどのフレームワークでも使われている考え方です。
実装方法などについては以下の記事が分かりやすかったです。
・参考記事
Spring FrameworkとDIについて - mookjp.io
06. DIを使いこなす | [Java] Spring Bootで簡単・高速にWebAPI開発
DIイメージ図
この記事はここだけでもよかった。
サーバの起動によってコンポーネントスキャン対象になっているクラスが、DIコンテナ上にインスタンス生成される。
別のクラスのインスタンスが生成された際にDIコンテナからインスタンス注入される。
DIコンテナのインスタンスから呼び出したメソッドはリクエストごとにスタック領域に展開されるが、DIコンテナで管理されるインスタンスはデフォルトではシングルトンになっているため、フィールド変数は別のリクエストによって発行された場合でも変数の内容は共有されるため、設計があまいとバグが発生する可能性がある。
インスタンスのスコープは@Scopeアノテーションによるコントロール可能であるため、シングルトンがまずい場合にはこれで制御する。
スコープ | 内容 |
---|---|
singleton | アプリケーション起動時に作成時のみインスタンス作成。破棄されない。 |
prototype | インスタンスが使われる度に作成され、使い終わったら破棄される。 |
request | HTTPリクエストの度に作成され、リクエスト終了時に破棄される。 |
session | HTTPセッションの度に作成され、セッション終了時に破棄される。 |
globalSession | グローバルHTTPセッションの度に作成され、セッション終了時に破棄される。 |