質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

19909閲覧

Springで@Autowiredと@Resourceの使い分け

argius

総合スコア9388

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

3グッド

1クリップ

投稿2016/06/07 13:05

Struts2とSpring4でDIを試しているのですが、
下記のコードの場合において、@Autowired@Resourceの使い分けが分かりません。

コンポーネントのMyComponentとサービスのMyMessageServiceがありますが、
どちらも@Autowiredを指定しても@Resourceを指定しても動作します。

それぞれどちらを指定するのが正しいのでしょうか。
また、それはなぜでしょうか。
条件によってはどちらかしか使えないとしたら、その条件とは何でしょうか。

環境

  • Struts2 (v2.5)
  • Spring4 (v4.2.6)
  • Tomcat8 (v8.0.26)
  • Java8

よろしくお願いします。


以下、ソースコードを貼ります。

  • FirstAction.java

lang

1package myapp.actions; 2 3import javax.annotation.Resource; 4import myapp.services.*; 5import org.apache.struts2.convention.annotation.*; 6// import org.springframework.beans.factory.annotation.Autowired; 7import com.opensymphony.xwork2.ActionSupport; 8 9public final class FirstAction { 10 11 // @Autowired 12 @Resource 13 MyComponent comp; 14 15 // @Autowired 16 @Resource 17 MyMessageService service; 18 19 @Action(value = "/first", results = { @Result(location = "/index.jsp") }) 20 public String doAction() { 21 System.out.println(comp.calc(3, 5)); 22 System.out.println(service.getMessage()); 23 return ActionSupport.SUCCESS; 24 } 25 26}
  • MyComponent.java

lang

1package myapp.services; 2 3public interface MyComponent { 4 5 public int calc(int a, int b); 6 7}
  • MyComponentImp.java

lang

1package myapp.services; 2 3import org.springframework.stereotype.Component; 4 5@Component 6public final class MyComponentImp implements MyComponent { 7 8 @Override 9 public int calc(int a, int b) { 10 return a + b; 11 } 12 13} 14
  • MyMessageService.java

lang

1package myapp.services; 2 3import org.springframework.stereotype.Service; 4 5@Service 6public final class MyMessageService { 7 8 public String getMessage() { 9 return "MyMessageService.getMessage()"; 10 } 11 12}
  • applicationContext.xml

lang

1<?xml version="1.0" encoding="UTF-8"?> 2<beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-4.2.xsd"> 10 11 <context:annotation-config /> 12 <context:component-scan base-package="myapp" /> 13 14</beans>

※他のファイルは省略

green5, stereo_code, A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

それぞれ以下の特徴があります。

  • @Autowired: 型が一致するクラスをDIする。
  • @Resource: 名称が一致するクラスをDIする。

ですので、どちらを使用しても正しいかと思います。
個人的な感覚では、@Autowiredや@Injectの方が使用されている気がします。

以下にSpringで使用される主なアノテーションが紹介されています。
http://tanakakns.hatenablog.com/entry/20120613/1339573480

投稿2016/06/07 15:01

KeiMiya

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/06/07 15:18

回答ありがとうございます! なるほど、例えばImplが複数あった時に名称が一致するほうを選択できるということですね。 実際にやってみて納得しました。 @Injectについてですが、 DIといえば@Inject(?)なので使ってみたかったのですが、このケースでは置き換えできませんでした。
guest

0

ベストアンサー

@Resource@Autowiredは、Spring管理にあるクラス名(orインタフェース)をからインスタンス化するクラスを自動的に探し当て、インスタンスを返すところでは全く一緒の動作をします。
ただし@Autowiredの方がより柔軟に動作します。以下はSpring4での対応です。

@Resourceは対象のプロパティまたはミューテータ(setメソッド)に対してのみ適用でき、かつ引数は1つのみ有効です。

@Autowiredは対象のプロパティとミューテータ(set~)、コンストラクタに対して動作し、かつ複数の引数でもインスタンス化を試みます。

参考資料:
Spring Framework Reference Documentation|6.9.4 Fine-tuning annotation-based autowiring with qualifiers

投稿2016/06/07 15:00

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/06/07 15:08

回答ありがとうございます! 今回のようにどちらでも良い場合は、どちらを選ぶかは慣習などで決まっているのでしょうか?
A-pZ

2016/06/07 16:22

個人的になStruts2のコンテナもSpringも使っている構成でしたら、Springのアノテーションで統一したほうが、規約もつくりやすいです。 Struts2のActionクラスをSpring管理下にもっていけるようになれば、あとは割と自由な個所に@Autowired組み込めますので、さまざまな使い方ができるようになります。
argius

2016/06/08 02:09

Springのアノテーションに統一する、というのは分かりやすいですね。 @Autowired+@Qualifierでも名前指定できることを確認しましたし、その方針でやってみることにします。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問