前回は、Spring環境を作成し、”Hellow World”をコンソールに表示しました。
次は、DI(依存性の注入)について勉強していきます。
やはりネットの情報だけでは、分かりづらかったのですが本で体系的(順序立てて)に学ぶと理解が深まります。
今回も下記の本を参考にしてます。
DI(依存性の注入)とは?
依存性の注入と言われてもピンとこないです。
ソフトウェアのデザインパターン の1つで、「Inversion of Control Principle(制御の反転の原則)」を実現します。DIを用いることで、コンポーネントを構成するインスタンスの生成と依存関係の解決をソースコードから分離することができます。
※本からの引用
ネットの情報も参考にすると、
依存性とは、オブジェクトのこと
注入は使う側に渡すこと
です。
つまり、依存性の注入は、オブジェクトを使う側に渡すことです。
少し分かりやすくなりました。
SpringでDI(依存性の注入)することのメリットとは?
SpringによるDI(依存性の注入)はDIコンテナがその機能を提供します。
DIコンテナを経由してインスタンスを管理することにより、以下のようなメリットを享受できるようになります。
・インスタンスのスコープを制御できる
・インスタンスのライフサイクルを制御できる
・共通機能を組み込める
・コンポーネント間が疎結合になるため、単体テストがしやすくなる
※本からの引用
上記いろいろメリットがありますが「インスタンスのスコープを制御」について説明します。
スコープとは簡単に言うと見える範囲の事です。
例えば、singletonは一度DIコンテナからBeanのインスタンスを作成すると、その後はずっとそのインスタンスを利用します。
prototypeの場合は、Beanのインスタンスを作成する度に新しいインスタンスを作成します。
このようにsingleton、prototypeでインスタンス作成後の見え方が変わるのです。
このスコープ機能を自前で実装するには、ソースを書かなきゃいけないし、バグが発生する可能性もあるけど、Springを使う事で簡単にスコープの機能を使うことができます。
SpringでDIを使うには
SpringでDIを使うには、代表的な3つの方法があります。
・JavaベースConfiguration
・XMLベースConfiguration
・アノテーションベースConfiguration
言葉で説明するよりサンプルプログラムを見た方が早いので、サンプルプログラムで紹介します。
サンプルプログラム
それぞれのサンプルコードを紹介します。
JavaベースConfiguration
Configuration定義
gist19ee17d15f5edc3ee34dba87c3a9dc5b
ポイントとしては6行目の”@Configuration”と10行目の”Bean”です。
ConfigurationアノテーションでDI対象となるように宣言し、DIコンテナに注入したいインスタンスはBeanアノテーションを付与します。
複数DIコンテナに注入したいのであれば、Beanアノテーションでクラスを定義すればOKです。
Bean定義
giste6fe8a69ddd363db4c116bd73b9e08f0
XMLベースConfiguration
applicationContext.xml
gist864230bf13d50e343d0eb6d9c603630e
11行目でDIコンテナに注入させたいパッケージを設定してます。
この指定したパッケージ配下で”@Component”や”@Service”、”@Controller”などのアノテーションをスキャンしてDIコンテナに注入します。
Bean定義
gist62ae54b89c6bb3c311e1f85522c5163a
アノテーションベースConfiguration
Bean定義
gist62ae54b89c6bb3c311e1f85522c5163a
サンプル実行ソース
gist147443987be6ddeaae89dff88a8283a7
サンプル実行
このプログラムを実行すると、コンソールにメッセージを表示します。(赤ワク部分)
最後に
このシンプルなサンプルを理解できれば、SpringでのDIのやり方はそんなに難しくないと思えるはずです。
また、サンプルでは「JavaベースConfiguration」、「XMLベースConfiguration」、
「アノテーションベースConfiguration」の3パターン用意しました。
複数人で開発を想定すると修正が競合する「JavaベースConfiguration」、「XMLベースConfiguration」はオススメできません。
「アノテーションベースConfiguration」が同じファイルを修正するケースもなく、記述量も少ないのでこちらがオススメです。
Gitに登録するのでぜひ、クローンしてローカルで動かしてみて下さい。
Gitからクローンしてeclipseにインポートするなら下記を参照ください。
コメント