MENU

【SpringBoot】DI(dependency injection)って何?

こんにちは。くまごろーです。
今SpringBootの勉強を進めてるんですけど、その中で「DI(dependency injection)」というワードが出てきました。
最初は「なにそれ?(=_=)」って感じだったんですけど、勉強していく内に色々わかってきたので、ここでまとめておこうと思います。

1 DI(dependency injection)とは
とりあえずWikipediaから引用。

依存性の注入(いそんせいのちゅうにゅう、英: Dependency injection)とは、コンポーネント間の依存関係をプログラムのソースコードから排除するために、外部の設定ファイルなどでオブジェクトを注入できるようにするソフトウェアパターンである。英語の頭文字からDIと略される。
  ~中略~
DIを利用したプログラムを作成する場合、コンポーネント間の関係はインタフェースを用いて記述し、具体的なコンポーネントを指定しない。具体的にどのコンポーネントを利用するかは別のコンポーネントや外部ファイル等を利用することで、コンポーネント間の依存関係を薄くすることができる。

依存性の注入 - Wikipedia
 
どういうことやねん・・・
てわけで、頑張って図を作った。

 
 
2 DIの有無で何が変わるか
 
DIがない場合のプログラム構造はこんな感じ。

<DI無> 
f:id:kumaGoro_95:20201009210206p:plain

各クラスが強く繋がっている。具体的にいうと、隣の階層のクラスをインスタンス化して使っている。この方法の何が問題かというと、

・ 各階層がつながりあっているので、階層がわかりづらい
・ 階層のつながりが強く、コードが複雑になる。
・ 単体テストを実施しづらい(例:サービスクラスを完成させないと、コントローラークラスが完成していてもエラー状態になるのでテストができない)

  
それを解消するDIを導入すると、下図のような構造になる。

<DI有>
f:id:kumaGoro_95:20201009212847p:plain

かなりわかりづらい図ですが・・・
クラス内で別階層のクラスをインスタンス化必要がない(別階層のクラスが未完成でも実装することができる)のがDIの大きな特徴になります。別階層が未完成でも単体テストができるというのが強みになる。
 
 
 
3 DIのメリット

最後に、DIのメリットについて列挙しておきます。

・各階層が分離して、わかりやすい構造になる。
・別階層のクラスをインスタンス化するなどの手続が不要になるので。コードがシンプルになる。
・別階層が未完成でもクラスを完成させられるので、単体テストが容易になる。

 
本当はサンプルコードとか載せたかったけど、今日はもう時間がないのでまたの機会にします。

 
 
4 参考
 
ビジネス層、永続化層をどう移すか?──Javaコンサルタントが語る、J2EEからJava EE 7への移行のポイント【後編】 - builder by ZDNet Japan
 
Java開発を変える最新の設計思想「Dependency Injection(DI)」とは(2ページ目) | 日経クロステック(xTECH)