421

DIで使用する必要があるアノテーションは、 @ Resourcejsr250)または@Autowired(Spring固有)ですか?

私は過去に両方をうまく使用しました、@Resource(name="blah")そして@Autowired @Qualifier("blah")

私の本能は、@Resourceタグがjsrの人々によって批准されているので、タグに固執することです。
誰かがこれについて強い考えを持っていますか?

4

11 に答える 11

547

@Autowired(または@Inject)とはどちらも@Resource同じように機能します。しかし、概念的な違いや意味の違いがあります

  • @Resource名前で既知のリソースを取得することを意味します。名前は、注釈付きのセッターまたはフィールドの名前から抽出されるか、name-Parameterから取得されます。
  • @Injectまたは、タイプ別に適切な他のコンポーネント@Autowiredを配線してみてください。

したがって、基本的にこれらは2つのまったく異なる概念です。残念ながら、Spring-Implementationに@Resourceはフォールバックが組み込まれており、名前による解決が失敗すると起動します。この場合、@Autowiredタイプ別の種類別の解像度にフォールバックします。このフォールバックは便利ですが、IMHOは概念の違いに気づかず、@Resourceタイプベースの自動配線に使用する傾向があるため、多くの混乱を引き起こします。

于 2012-06-06T14:54:38.207 に答える
210

3.0より前の春では、どちらでも構いません。

Spring 3.0では、標準(JSR-330)アノテーションがサポートされています。@javax.inject.Injectこれを。と組み合わせて使用​​して@Qualifierください。@javax.inject.QualifierSpringがメタアノテーションもサポートするようになったことに注意してください。

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

だからあなたは持つことができます

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

また

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

その後:

@Inject @YourQualifier private Foo foo;

これにより、文字列名の使用が少なくなります。文字列名は、スペルが間違っている可能性があり、保守が困難です。


元の質問については、両方とも、注釈の属性を指定せずに、タイプごとにインジェクションを実行します。違いは次のとおりです。

  • @Resource注入されたBeanの名前を指定できます
  • @Autowired必須ではないものとしてマークすることができます。
于 2010-11-04T09:21:16.520 に答える
82

主な違いは@Autowired、春の注釈です。@Resourceあなたがあなた自身を指摘したように、JSR-250によって指定されているのに対して。したがって、後者はJavaの一部ですが、前者はSpring固有です。

したがって、ある意味でそれを示唆するのは正しいことです。それがより強力であるため、私は人々が@Autowired一緒に使用するのを見つけました。@Qualifier特に春の場合、あるフレームワークから別のフレームワークに移動することは、神話ではないにしても、非常にありそうもないと考えられています。

于 2010-11-04T03:39:51.177 に答える
74

この質問に対するこの回答について、 @Julesからのコメントを1つ強調したいと思います。コメントは便利なリンクをもたらします:@ Resource、@ Autowired、@Injectを使用したSpringInjection 。完全に読むことをお勧めしますが、その有用性の簡単な要約を次に示します。

アノテーションはどのように適切な実装を選択しますか?

@Autowired@Inject

  1. タイプ別の一致
  2. 修飾子による制限
  3. 名前による一致

@Resource

  1. 名前による一致
  2. タイプ別の一致
  3. 修飾子による制限(名前で一致が見つかった場合は無視されます)

Beanを注入するために、どのアノテーション(またはその組み合わせ)を使用する必要がありますか?

  1. コンポーネントに明示的に名前を付けます[@Component( "beanName")]

  2. 属性[@Resource(name = "beanName")]@Resourceとともに使用しますname

なぜ使用しないの@Qualifierですか?

@Qualifier類似のBeanのリストを作成する場合を除いて、アノテーションは避けてください。たとえば、一連のルールに特定の@Qualifier注釈を付けることができます。このアプローチにより、データの処理に使用できるリストにルールクラスのグループを簡単に挿入できます。

Beanインジェクションは私のプログラムを遅くしますか?

コンポーネントの特定のパッケージをスキャンします[context:component-scan base-package="com.sourceallies.person"]。これにより構成が増えcomponent-scanますが、Springコンテキストに不要なコンポーネントを追加する可能性が低くなります。


参照: @ Resource、@ Autowired、@Injectを使用したSpringInjection

于 2014-05-27T10:56:43.977 に答える
39

これは私がSpring3.0.xリファレンスマニュアルから得たものです:-

ヒント

アノテーション駆動型インジェクションを名前で表現する場合は、@ Qualifier値を介してBean名を技術的に参照できる場合でも、主に@Autowiredを使用しないでください。代わりに、JSR-250 @Resourceアノテーションを使用します。これは、特定のターゲットコンポーネントを一意の名前で識別するために意味的に定義されており、宣言されたタイプはマッチングプロセスとは無関係です。

このセマンティックの違いの具体的な結果として、コレクションまたはマップタイプとして定義されているBeanは、タイプマッチングが適切に適用されないため、@Autowiredを介して注入できません。特定のコレクションまたはマップBeanを一意の名前で参照して、そのようなBeanに@Resourceを使用します。

@Autowiredは、フィールド、コンストラクター、およびマルチ引数メソッドに適用され、パラメーターレベルで修飾子アノテーションを絞り込むことができます。対照的に、@ Resourceは、単一の引数を持つフィールドとBeanプロパティセッターメソッドでのみサポートされます。結果として、インジェクションターゲットがコンストラクターまたはマルチ引数メソッドである場合は、修飾子を使用してください。

于 2013-09-24T09:26:49.773 に答える
28

@Autowired + @Qualifierは、Spring DIでのみ機能します。将来、他のDIを使用する場合は、@Resourceが適切なオプションです。

私が非常に重要だと思った他の違いは、@ Qualifierはプレースホルダーをサポートしていないのに対し、@ Qualifierは動的Beanワイヤリングをサポートしていないのに対し、@Resourceは非常にうまく機能していることです。

例:このような複数の実装を持つインターフェースがある場合

interface parent {

}
@Service("actualService")
class ActualService implements parent{

}
@Service("stubbedService")
class SubbedService implements parent{

}

@ Autowiredと@Qualifierを使用すると、次のような特定の子実装を設定する必要があります。

@Autowired
@Qualifier("actualService") or 
@Qualifier("stubbedService") 
Parent object;

これはプレースホルダーを提供しませんが、@ Resourceを使用すると、プレースホルダーを配置し、プロパティファイルを使用して次のような特定の子実装を挿入できます。

@Resource(name="${service.name}")
Parent object;  

ここで、service.nameはプロパティファイルで次のように設定されます

#service.name=actualService
 service.name=stubbedService

それが誰かを助けることを願っています:)

于 2015-03-26T03:55:19.687 に答える
17

どちらも同じように良いです。リソースを使用する利点は、将来、Spring以外の別のDIフレームワークが必要な場合に、コードの変更がはるかに簡単になることです。Autowiredを使用すると、コードはスプリングDIと緊密に結合されます。

于 2010-11-04T02:59:27.080 に答える
17

これら2つのアノテーションの基本クラスから批判的に分析すると、次の違いに気付くでしょう。

@AutowiredAutowiredAnnotationBeanPostProcessor 依存関係を注入するために使用します。依存関係を注入するために
@Resource使用します。CommonAnnotationBeanPostProcessor

異なるポストプロセッサクラスを使用していても、すべてほぼ同じように動作します。違いは、以下で強調した実行パスに決定的にあります。

@Autowired / @Inject

1.タイプ
別の一致2.修飾
子による制限3.名前別の一致

@Resource

1.名前
による一致2.タイプ
による一致3.修飾子による制限(名前で一致が見つかった場合は無視されます)

于 2018-10-05T11:23:37.510 に答える
6

@ResourceBeanのセルフインジェクションを実行できるため、トランザクションやセキュリティ関連のものなど、Beanポストプロセッサによって追加されたすべての追加ロジックを実行するために必要になる場合があります。

Spring 4.3+では@Autowired、これも可能です。

于 2017-06-20T20:25:51.363 に答える
2

@Resource多くの場合、JNDIを介して定義された高レベルのオブジェクトによって使用されます。@Autowiredまたは@Inject、より一般的なBeanによって使用されます。

私の知る限り、それは仕様でも、慣習でもありません。これは、標準コードがこれらのアノテーションを使用する論理的な方法です。

于 2014-03-07T18:06:05.303 に答える
0

ここでの注意として: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContextそして注釈では機能しSpringBeanAutowiringSupport.processInjectionBasedOnServletContext ません@Resource 。ですから、違いがあります。

于 2013-06-17T17:12:02.573 に答える