SEワンタンの独学備忘録

独学した内容や資格試験に対する取り組みの備忘録

【Spring】DI(依存性の注入)の概要イメージ

DIについての説明自体はいろんなところでされていますが、少ししっくりきたのでDIの概要イメージの備忘録

DIとは

DIは「Dependency Injection (依存性注入) 」と言われる考え方になります。
あるクラスが別のクラスをインスタンス変数に持つなどして利用 (依存) している場合に、インスタンス変数の設定 (依存性の解決) をクラス内で行うのではなく、外部から設定 (注入) するというデザインパターンの一つです。

依存性とは言いますが、オブジェクトで考えとよいみたいです。

ちなみにSpringにおけるDIコンテナはDIで作られたインスタンスを格納する入れ物という考え方で問題ないみたいです。
Springに限らずstrutsなどのフレームワークでも使われている考え方です。


実装方法などについては以下の記事が分かりやすかったです。

・参考記事
Spring FrameworkとDIについて - mookjp.io
06. DIを使いこなす | [Java] Spring Bootで簡単・高速にWebAPI開発

DIイメージ図

この記事はここだけでもよかった。


f:id:wantanBlog:20190905212443p:plain


サーバの起動によってコンポーネントスキャン対象になっているクラスが、DIコンテナ上にインスタンス生成される。
別のクラスのインスタンスが生成された際にDIコンテナからインスタンス注入される。
DIコンテナのインスタンスから呼び出したメソッドはリクエストごとにスタック領域に展開されるが、DIコンテナで管理されるインスタンスはデフォルトではシングルトンになっているため、フィールド変数は別のリクエストによって発行された場合でも変数の内容は共有されるため、設計があまいとバグが発生する可能性がある。


インスタンスのスコープは@Scopeアノテーションによるコントロール可能であるため、シングルトンがまずい場合にはこれで制御する。

スコープ 内容
singleton アプリケーション起動時に作成時のみインスタンス作成。破棄されない。
prototype インスタンスが使われる度に作成され、使い終わったら破棄される。
request HTTPリクエストの度に作成され、リクエスト終了時に破棄される。
session HTTPセッションの度に作成され、セッション終了時に破棄される。
globalSession グローバルHTTPセッションの度に作成され、セッション終了時に破棄される。


参考元:
06. DIを使いこなす | [Java] Spring Bootで簡単・高速にWebAPI開発