Open Source Web Development Tutorials - Dev Shed
Spring Framework入門!:IoCを押さえよう
(2008/11/25公開)
Spring Framework:IoCについて
IoC(Inversion of Control:制御反転)は、Springの中核的な機能の1つです。この機能は、ビジネスロジックの実装の簡素化に役立ちます。Spring Frameworkを十分に活用するには、フレームワークのIoCコンテナについて理解することが必要です。そこで、この記事ではIoCを中心として解説します。これは、Spring Frameworkによって提供される概念であり同時にコンテナでもあります。
最初のセクションでは、IoCの概念を、依存性導入との関係を含めて解説します。2番目と3番目のセクションでは、Spring Frameworkで提供されているIoCサービスを使用するために必要な手順について説明します。最後のセクションでは、最初のセクションで説明した概念と、2番目および3番目のセクションで説明した手順に基づいてアプリケーションを作成します。
制御反転について
IoCすなわち制御反転は、サービスやコンポーネントをアプリケーションプログラムに接続するための手法の1つです。IoCの定義は「従来の対話型モードと比較して、システムの制御フローが反転されるソフトウエア設計パターンおよび一連の関連するプログラミング手法」です。簡単に述べると、IoCでは、アプリケーションがフレームワークを呼び出すのではなく、アプリケーションによって指定されたコンポーネントをフレームワーク側が呼び出します。
この手法は、ハリウッドの代理人がクライアントを採用する方法と似ています。そこで、「電話してくるな、用があればこちらから電話する」手法と表現されることがあります。この理由から、IoCはハリウッド手法と呼ばれることもあります。
ただし、IoCは広い意味を持つ一般的な用語です。Spring Frameworkで使用されるIoCの要素は、「必要なリソースまたは依存性を実行時に、それに依存しているリソースへ導入する」というもので、依存性導入とも呼ばれます。このため、SpringのIoCコンテナで提供されるサービスが依存性導入です。ここでは、IoCおよび依存性導入という用語をゆるい意味で使用します。
依存性導入には次の3つの形式があります。
1.コンストラクタ導入
2.セッター導入
3.インターフェース導入
これらの中で、Spring Frameworkで直接サポートされているのは最初と2番目の形式です。3番目の形式は間接的にサポートされています。最初と2番目のうち、Spring Frameworkでは2番目の形式を使用することが推奨されています。以下では、これらの詳細について説明します。
1.コンストラクタ導入:コンストラクタ導入では、IoCコンテナがコンストラクタを使用して依存性を導入します。すべての依存性は、単純な値であるか、ほかのオブジェクトへの参照であるかにかかわらず、コンストラクタで宣言されます。コントラクタ導入の利点の1つは、すべての依存性を1回で定義できることです。これは、クラスが依存しているサービスが多すぎるかどうかを判断するためにも役立ちます。
2.セッター導入:この形式の依存性導入では、セッター(対応するインスタンス変数の値を変更するため、ミューテータとも呼ばれます)を使用して、必要なリソースや依存関係を導入します。言い換えると、クラスが依存する各オブジェクトがセッターであり、IoCコンテナはセッターを使用して実行時にリソースを提供します。
コンストラクタ導入とセッター導入の主な相違点は、コンストラクタ導入では依存しているオブジェクトのインスタンス作成時に依存性が渡されるのに対して、セッター導入では依存しているオブジェクトのインスタンスが作成された後に依存性が渡されることです。Spring Frameworkでは、コンストラクタ導入よりもセッター導入が推奨されています。
3.インターフェース導入:インターフェース導入では、構成に従って、依存しているオブジェクトへのインターフェースの強固な実装が提供されます。インターフェース導入と、前記2つの導入との主な相違点は、インターフェース導入ではインターフェースの任意の実装を導入可能なのに対して、前の2つの方法では指定されたクラスのオブジェクトが導入されることです。Springでは、インターフェース導入は直接サポートされていません。
IoCの概要は以上です。次に、それぞれの形式をSpring Frameworkでどのように使用するかについて説明します。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








