@Qualifierを使って任意のIDをつける方法(インタフェースと実クラスが1対nの場合の対処方法)

spring

springMVCのDIで管理されるID名(spring内部で管理されるID)は、@Autowiredのみを使った場合、ID名は自動で識別されます。

spring2.4以前であれば、ID名をxmlで定義していましたが、spring2.5以降は、アノテーション(@Qualifier)でもID名を指定することが出来るようになりました。

[スポンサーリンク]

今回は、springMVCのDIで管理されるID名を任意のID名にする方法を解説していきます。
個人的には、設定ファイルよりもアノテーションの方が、設定が楽になった印象を持ちました。

この章でやること

@Qualifierの使い方を解説します。

@Qualifierを使う背景について

springの「@autowired」と「@component」を使った場合、通常インターフェース名がDI管理されるIDとなります。では以下のようにインターフェースが1つに対して、実クラスが2つあった場合、ID名=インターフェース名とすることが出来ません。

Qualifier

上記の場合、開発者がそれぞれの実クラスに対して任意のID名を決める必要があります。
そこで、@Qualifierを使って「ID名を指定」&「指定したIDを使用」します。

@Qualifierを使った実装

ID名の付け方と、IDを指定したクラスの呼び出し方のサンプルソースになります。

インターフェース

public interface QualifierService {

	public String find(String str);

}

実クラスAAA

@Component("com.example.service.impl.QualifierAAAServiceImpl")
public class QualifierAAAServiceImpl implements QualifierService {

	public String find(String str) {
		return "AAA";
	}

}

実クラスBBB

@Component("com.example.service.impl.QualifierBBBServiceImpl")
public class QualifierBBBServiceImpl implements QualifierService {

	public String find(String str) {
		return "BBB";
	}

}

AAAを呼び出す

	@Qualifier("com.example.service.impl.QualifierAAAServiceImpl")
	@Autowired
	private QualifierService service;

springMVCのひな型の作成方法は、「springsource tool suite Webアプリを自動生成してみよう編」を参照して下さい。

解説

実クラスAAAとBBBの@ComponentでID名をそれぞれ指定しています。
呼び出し方は、@QualifierでそれぞれのID名を指定することで、どの実クラスを@Autowiredするのかを指定しています。

実は@Autowiredで指定する時に、メンバ変数の型をインターフェースではなく、実クラスを型に指定することも可能です。(spring内部で自動的に補完してくれます。)
ただし、springは@Autowiredでメンバ変数にインジェクションする際には、メンバ変数の型を実クラスではなくインタフェース名を指定することを提唱しています。事実メンバ変数の型を実クラスにすると色々な弊害がうまれます。(例えば@Transactionalが動作しなかったり、、、)
よって、よほどの理由が無い場合は、メンバ変数の型は@Qualifierを使ってインタフェースを使用することをオススメします。

springMVCのバージョン

org.springframework-versionは、3.1.0を使っています。
javaは、1.6.0を使っています。

最後に

@Qualifierを使った任意のID指定方法についてはいかがでしたか?spring2.5以降では、わざわざ設定ファイルに記述することなく、ID名を指定することが出来るので、私はspringの使い勝手が非常に楽になった印象を持っています。
便利な機能が充実して、springの敷居がどんどん下がっていってくれるのは嬉しいですね。