spring2.5のアノテーション@Autowiredと@Resource

@Autowiredと@Resourceの違いってなんだろうか。調べてみる。

@Autowired

タイプ(型)が一致する依存性の注入を行う。
フィールド、コンストラクタ、メソッドに付与することが可能。メソッドに付与した場合、そのメソッドは「セッター」メソッドである必要はなく、複数のパラメータを受け取ることができる。

例)

@Autowired
public void fire(Bomb bomb, Timer timer) {
    //何かの処理
}

requiredプロパティを設定できる
例)

@Autowired(required=false)
public UfufuObject ufufuObject;

こうするとUfufuObject型のクラスが見つからない場合でもエラーにならない。

@Resource

名前と一致する「Bean名」を持つSpring管理オブジェクトが注入を行う。名前が一致するクラスが見つからない場合、タイプ(型)による検索を行う。型に一致するクラスが1つのみ見つかった場合に注入を行う。
フィールド、メソッドに付与することが可能。
例)

@Resource("ufufuObject")
public UfufuObject ufufuObject;

これで"ufufuObject"という名前を持つBeanが注入される

@Resource
public UfufuObject ufufuObject;

こうすると変数名の"ufufuObject"という名前からBeanを検索する


う〜む。それぞれどういう場面で使い分けたらいいんだろう。。。

一見すると@Resourceのほうが使い勝手がいい気がするが、@Qualifierを併用することで、@Autowiredの方が使い勝手は良くなりそう。

@Autowired
@Qualifier("awawawawa")
public UfufuObject ufufuObject;

とすれば名前による注入もできるし

//DataSourceは型で指定、UfufuObjectは名前で指定
@Autowired
public void set(@Qualifier("awawawawa")UfufuObject ufufuObject,DataSource dataSource){
    //処理
}

なんていうこともできる。
Springの歴史的にも細かく設定できるように@Autowiredが追加されたみたいだし。。。
気が向いたらもっと詳しく調べる。

以上。