Springの@Autowiredと@Resourceの違いについて

spring

Springでもっともたくさん使うアノテーションといえば、フィールドにbeanをインジェクトする@Autowiredか@Resourceのどちらかではないでしょうか。

@Autowiredと@Resourceはほぼ同じ動きをしますが使い分けがいまひとつ分からない。わたしはSpringを使いはじめたころ違いがよくわかりませんでした。

今回はこの2つのアノテーションの違いについて紹介していきます。

[スポンサーリンク]

@Autowiredと@Resourceの大きな違い

大きな違いとしては、@AutowiredはBean名が指定できないのに対して、@ResourceはBean名を指定することが可能です。
誤解がないように補足すると、@Autowiredは別のアノテーションを使ってBean名を指定します。
以降に細かい解説をしていきます。

@Resourceの使い方

まずは@Resourceの使い方です。
こちらのように、Bean名とクラス名が同じ場合は@Resourceのみの指定でBeanをインジェクト(注入)できます。

// 呼び出す側のクラスです。
@Resource
private ExampleService exampleService;

// 呼び出される側のクラスです。
@Service
public class ExampleService {
・
・
}

しかし、こちらのようにBean名とクラス名が違う場合は、@Resource内でBean名を指定する必要があります。

// 呼び出す側のクラスです。
@Resource(name="testbean")
private ExampleService exampleService;

<!-- 呼び出される側のクラスです。-->
	<beans:bean class="jp.co.example.service.ExampleService" id="testbean">
	</beans:bean>

@Autowiredの使い方

では続いて@Autowiredの使い方を見ていきましょう。
@Resourceのときと同じように、Bean名とクラス名が同じ場合は@Autowiredのみの指定でBeanをインジェクト(注入)できます。

// 呼び出す側のクラスです。
@Autowired
private ExampleService exampleService;

// 呼び出される側のクラスです。
@Service
public class ExampleService {
・
・
}

しかし、こちらのようにBean名とクラス名が違う場合は、@Autowired内だけではダメです。
@Qualifierを使ってBean名を指定する必要があります。
ここが@Resourceとの大きな違いです。

// 呼び出す側のクラスです。
@Autowired
@Qualifier("testbean")
private ExampleService exampleService;

<!-- 呼び出される側のクラスです。-->
	<beans:bean class="jp.co.example.service.ExampleService" id="testbean">
	</beans:bean>

springとjavaのバージョン

springのバージョンは、4.2.0を使っています。
javaは、version 8です。

さいごに

@Resourceと@Autowiredの大きな違いは、クラス名とBean名が異なった場合のインジェクション(注入)方法だと覚えておきましょう。

@Resourceの方が一行で書けるので私は好きです。

それでは!