web-dev-qa-db-ja.com

Spring Frameworkの@Injectと@Autowiredの違いは何ですか?どの条件の下でどれを使うべきですか?

私はSpringSourceでいくつかのブログを読み進めていますが、そのうちの1つのブログでは、作者は@Injectを使用していますが、@Autowiredも使用できると思います。

これがそのコードです。

@Inject private CustomerOrderService customerOrderService;

私は@Inject@Autowiredの違いについて確信が持てませんし、誰かが彼らの違いを説明し、どの状況下でどちらを使用するべきかを説明してくれたらありがたいですか?

622
Rachel

ここでは、 javax.inject.Inject アノテーションを参照しているとします。 @Injectは、Java EE 6(JSR-299)で導入されたJava CDI( コンテキストと依存性注入 )標準の一部です。 続きを読む 。 Springは、独自の@Injectアノテーションと同義の@Autowiredの使用をサポートすることを選択しました。

それで、あなたの質問に答えるために、@AutowiredはSpring自身の(従来の)アノテーションです。 @Injectは、Springに似た依存性注入の標準を定義するCDIと呼ばれる新しいJavaテクノロジの一部です。 Springアプリケーションでは、2つのアノテーションは、Springが独自のJSR-299アノテーションをサポートすることを決定したのと同じように機能します。

651
pap

これは@Resource@Inject、そして@Autowiredを比較した ブログ投稿 で、かなり包括的な仕事をしているようです。

リンクから:

テスト2と7を除いて、構成と結果は同じでした。ボンネットの裏側を見ると、 '@ Autowired'アノテーションと '@Inject'アノテーションは同じように動作することがわかりました。これらのアノテーションはどちらも依存関係を注入するために「AutowiredAnnotationBeanPostProcessor」を使用します。 「@Autowired」と「@Inject」は、Spring Beanを注入するために互換的に使用できます。ただし、「@ Resource」アノテーションは「CommonAnnotationBeanPostProcessor」を使用して依存関係を注入します。異なるポストプロセッサクラスを使用していても、それらはすべてほぼ同じように動作します。以下はそれらの実行パスの要約です。

作成者が参照するテスト2および7は、それぞれ「フィールド名による注入」および「不適切な修飾子を使用したBeanの解決の試み」です。

結論はあなたがあなたが必要とするすべての情報をあなたに与えるべきです。

148

配線がない状況を処理するために、@Autowiredrequired属性をfalseに設定したBeanを使用できます。

ただし、@Injectを使用する場合、ProviderインタフェースはBeanと連携します。つまり、Beanは直接注入されるのではなく、Providerと注入されます。

30
amits

Spring 3.0以降、SpringはJSR-330依存性注入アノテーション(@Inject@Named@Singleton)のサポートを提供します。

それらについては Springのドキュメントには別セクション があり、それらのSpringに相当するものとの比較も含まれています。

23

@Autowired@Injectの主な違い( Spring Docs を読むときに気付かれる)は、@Autowiredは 'required'属性を持ち、@Injectは 'required'属性を持たないことです。

20
Lucky

常に@Injectを使用してください。なぜなら、私たちのアプリケーションをフレームワークにとらわれないのは、(Sunが提供する)Java構成アプローチだからです。だから春になってもあなたのクラスはうまくいくでしょう。

@Autowiredを使用する場合は、@AutowiredはSpringが提供する注釈であるため、Springでのみ機能します。

14
tech.yenduri

@Injectには 'required'属性がありません

12

@AutowiredアノテーションはSpringフレームワークで定義されています。

@Injectアノテーションは標準のアノテーションで、標準の「 "Dependency Injection for Java"(JSR-330) で定義されています。 Spring(バージョン3.0以降)は、標準JSR-330で定義されている依存性注入の一般化モデルをサポートしています。 ( Google Guiceフレームワーク および /Picocontainerフレームワーク このモデルもサポート)。

@Injectを使うと、Providerインターフェースの実装への参照を注入することができます。これにより、遅延参照を注入することができます。

アノテーション@Inject@Autowiredは、ほぼ完全に類似しています。 @Autowiredアノテーションと同様に、@Injectアノテーションは自動バインディングのプロパティ、メソッド、およびコンストラクタに使用できます。

@Autowiredアノテーションとは対照的に、@Injectアノテーションはrequired属性を持ちません。したがって、依存関係が見つからない場合は - 例外がスローされます。

結合特性の説明にも違いがあります。注入用のコンポーネントの選択にあいまいさがある場合は、@Named修飾子を追加する必要があります。同様の状況で@Autowiredアノテーションが追加されます@Qualifier修飾子(JSR-330はそれ自身の@Qualifierアノテーションを定義し、この修飾子アノテーションを介して@Namedが定義されます).

12
Aleksey Bykov

上記に加えて:

  1. @Autowired BeanのデフォルトのスコープはSingletonですが、JSR 330の@Injectアノテーションを使用すると、Springのprototypeのようになります。
  2. @Injectを使用したJSR 330には@Lazyに相当するものはありません。
  3. @Injectを使用したJSR 330には、@ Valueと同等のものはありません。
9
Keyur Vyas

@InjectアノテーションはJSR-330アノテーションコレクションの1つです。これには、タイプによる一致、修飾子による一致、名前による一致の実行パスがあります。これらの実行パスは、セッター注入とフィールド注入の両方に有効です。@Autowiredアノテーションの動作は、@Injectアノテーションと同じです。唯一の違いは、@AutowiredアノテーションがSpringフレームワークの一部であるということです。 @Autowiredアノテーションにも上記の実行パスがあります。だから私はあなたの答えに@Autowiredを推薦します。

0