DIで使用する必要があるアノテーションは、 @ Resource(jsr250)または@Autowired(Spring固有)ですか?
私は過去に両方をうまく使用しました、@Resource(name="blah")
そして@Autowired @Qualifier("blah")
私の本能は、@Resource
タグがjsrの人々によって批准されているので、タグに固執することです。
誰かがこれについて強い考えを持っていますか?
DIで使用する必要があるアノテーションは、 @ Resource(jsr250)または@Autowired(Spring固有)ですか?
私は過去に両方をうまく使用しました、@Resource(name="blah")
そして@Autowired @Qualifier("blah")
私の本能は、@Resource
タグがjsrの人々によって批准されているので、タグに固執することです。
誰かがこれについて強い考えを持っていますか?
@Autowired
(または@Inject
)とはどちらも@Resource
同じように機能します。しかし、概念的な違いや意味の違いがあります
@Resource
名前で既知のリソースを取得することを意味します。名前は、注釈付きのセッターまたはフィールドの名前から抽出されるか、name-Parameterから取得されます。@Inject
または、タイプ別に適切な他のコンポーネント@Autowired
を配線してみてください。したがって、基本的にこれらは2つのまったく異なる概念です。残念ながら、Spring-Implementationに@Resource
はフォールバックが組み込まれており、名前による解決が失敗すると起動します。この場合、@Autowired
タイプ別の種類別の解像度にフォールバックします。このフォールバックは便利ですが、IMHOは概念の違いに気づかず、@Resource
タイプベースの自動配線に使用する傾向があるため、多くの混乱を引き起こします。
3.0より前の春では、どちらでも構いません。
Spring 3.0では、標準(JSR-330)アノテーションがサポートされています。@javax.inject.Inject
これを。と組み合わせて使用して@Qualifier
ください。@javax.inject.Qualifier
Springがメタアノテーションもサポートするようになったことに注意してください。
@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
必須ではないものとしてマークすることができます。主な違いは@Autowired
、春の注釈です。@Resource
あなたがあなた自身を指摘したように、JSR-250によって指定されているのに対して。したがって、後者はJavaの一部ですが、前者はSpring固有です。
したがって、ある意味でそれを示唆するのは正しいことです。それがより強力であるため、私は人々が@Autowired
一緒に使用するのを見つけました。@Qualifier
特に春の場合、あるフレームワークから別のフレームワークに移動することは、神話ではないにしても、非常にありそうもないと考えられています。
この質問に対するこの回答について、 @Julesからのコメントを1つ強調したいと思います。コメントは便利なリンクをもたらします:@ Resource、@ Autowired、@Injectを使用したSpringInjection 。完全に読むことをお勧めしますが、その有用性の簡単な要約を次に示します。
@Autowired
と@Inject
@Resource
コンポーネントに明示的に名前を付けます[@Component( "beanName")]
属性[@Resource(name = "beanName")]@Resource
とともに使用しますname
@Qualifier
ですか?@Qualifier
類似のBeanのリストを作成する場合を除いて、アノテーションは避けてください。たとえば、一連のルールに特定の@Qualifier
注釈を付けることができます。このアプローチにより、データの処理に使用できるリストにルールクラスのグループを簡単に挿入できます。
コンポーネントの特定のパッケージをスキャンします[context:component-scan base-package="com.sourceallies.person"]
。これにより構成が増えcomponent-scan
ますが、Springコンテキストに不要なコンポーネントを追加する可能性が低くなります。
これは私がSpring3.0.xリファレンスマニュアルから得たものです:-
ヒント
アノテーション駆動型インジェクションを名前で表現する場合は、@ Qualifier値を介してBean名を技術的に参照できる場合でも、主に@Autowiredを使用しないでください。代わりに、JSR-250 @Resourceアノテーションを使用します。これは、特定のターゲットコンポーネントを一意の名前で識別するために意味的に定義されており、宣言されたタイプはマッチングプロセスとは無関係です。
このセマンティックの違いの具体的な結果として、コレクションまたはマップタイプとして定義されているBeanは、タイプマッチングが適切に適用されないため、@Autowiredを介して注入できません。特定のコレクションまたはマップBeanを一意の名前で参照して、そのようなBeanに@Resourceを使用します。
@Autowiredは、フィールド、コンストラクター、およびマルチ引数メソッドに適用され、パラメーターレベルで修飾子アノテーションを絞り込むことができます。対照的に、@ Resourceは、単一の引数を持つフィールドとBeanプロパティセッターメソッドでのみサポートされます。結果として、インジェクションターゲットがコンストラクターまたはマルチ引数メソッドである場合は、修飾子を使用してください。
@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
それが誰かを助けることを願っています:)
どちらも同じように良いです。リソースを使用する利点は、将来、Spring以外の別のDIフレームワークが必要な場合に、コードの変更がはるかに簡単になることです。Autowiredを使用すると、コードはスプリングDIと緊密に結合されます。
これら2つのアノテーションの基本クラスから批判的に分析すると、次の違いに気付くでしょう。
@Autowired
AutowiredAnnotationBeanPostProcessor
依存関係を注入するために使用します。依存関係を注入するために
@Resource
使用します。CommonAnnotationBeanPostProcessor
異なるポストプロセッサクラスを使用していても、すべてほぼ同じように動作します。違いは、以下で強調した実行パスに決定的にあります。
@Autowired / @Inject
1.タイプ
別の一致2.修飾
子による制限3.名前別の一致
@Resource
1.名前
による一致2.タイプ
による一致3.修飾子による制限(名前で一致が見つかった場合は無視されます)
@Resource
Beanのセルフインジェクションを実行できるため、トランザクションやセキュリティ関連のものなど、Beanポストプロセッサによって追加されたすべての追加ロジックを実行するために必要になる場合があります。
Spring 4.3+では@Autowired
、これも可能です。
@Resource
多くの場合、JNDIを介して定義された高レベルのオブジェクトによって使用されます。@Autowired
または@Inject
、より一般的なBeanによって使用されます。
私の知る限り、それは仕様でも、慣習でもありません。これは、標準コードがこれらのアノテーションを使用する論理的な方法です。
ここでの注意として:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext
そして注釈では機能しSpringBeanAutowiringSupport.processInjectionBasedOnServletContext
ません@Resource
。ですから、違いがあります。