755

私はSpringSourceでいくつかのブログを調べていますが、そのブログの1つで、作成者が使用して@Injectおり、彼も使用できると思います@Autowired

コードは次のとおりです。

@Inject private CustomerOrderService customerOrderService;

との違いがわかりません。誰かが違い@Inject@Autowired説明し、どのような状況でどちらを使用するかを説明していただければ幸いです。

4

11 に答える 11

779

ここで、javax.inject.Inject注釈を参照していると仮定します。は、Java EE 6(JSR-299)で導入され@InjectたJava CDI(Contexts and Dependency Injection )標準の一部です。詳細はこちらをご覧ください。Springは@Inject、独自の注釈と同義の注釈の使用をサポートすることを選択しました@Autowired

だから、あなたの質問に答えるために、@AutowiredSpring自身の注釈があります。@InjectSpringと同様の依存性注入の標準を定義するCDIと呼ばれるJavaテクノロジーの一部です。Springアプリケーションでは、2つのアノテーションは、Springが独自のアノテーションに加えていくつかのJSR-299アノテーションをサポートすることを決定したのと同じように機能します。

于 2011-08-22T07:08:15.090 に答える
169

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

リンクから:

テスト 2 と 7 を除いて、構成と結果は同じでした。内部を調べたところ、'@Autowired' と '@Inject' アノテーションの動作は同じであることがわかりました。これらのアノテーションは両方とも、「A​​utowiredAnnotationBeanPostProcessor」を使用して依存関係を注入します。「@Autowired」と「@Inject」は交換可能に使用して、Spring Bean を注入できます。ただし、「@Resource」アノテーションは「CommonAnnotationBeanPostProcessor」を使用して依存関係を注入します。これらは異なるポスト プロセッサ クラスを使用していますが、ほとんど同じように動作します。以下は、それらの実行パスの概要です。

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

結論は、必要なすべての情報を提供する必要があります。

于 2011-08-22T05:28:37.087 に答える
41

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

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

于 2012-01-25T14:27:02.560 に答える
28

と の主な違い ( Spring Docsを読むときに気づいた)は@Autowired、「必須」属性があるのに対し、@Inject には「必須」属性がないことです。@Inject@Autowired

于 2015-11-17T09:39:20.213 に答える
26

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

Spring のドキュメントには、Spring の同等物との比較を含む、それらに関する別のセクションがあります。

于 2013-07-17T09:17:05.207 に答える
16

常に @Inject を使用することをお勧めします。アプリケーションをフレームワークにとらわれないようにするのは、Java 構成アプローチ (sun が提供) であるためです。したがって、春もあなたのクラスが機能します。

@Autowired を使用する場合、@Autowired はスプリング提供のアノテーションであるため、スプリングでのみ機能します。

于 2015-11-26T17:27:37.683 に答える
14

上記に加えて:

  1. @AutowiredBeanのデフォルトのスコープはシングルトンですが、JSR 330@Injectアノテーションを使用すると、 Spring のプロトタイプのようになります。
  2. JSR 330 using には @Lazy に相当するものはありません@Inject
  3. JSR 330 using には @Value に相当するものはありません@Inject
于 2015-06-22T03:39:50.603 に答える
14

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

@Injectアノテーションは、標準の「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が定義されます)。

于 2015-10-08T12:15:43.040 に答える
12

@Inject「必須」属性がありません

于 2014-08-19T09:44:26.200 に答える