私はSpringSourceでいくつかのブログを調べていますが、そのブログの1つで、作成者が使用して@Inject
おり、彼も使用できると思います@Autowired
。
コードは次のとおりです。
@Inject private CustomerOrderService customerOrderService;
との違いがわかりません。誰かが違い@Inject
を@Autowired
説明し、どのような状況でどちらを使用するかを説明していただければ幸いです。
私はSpringSourceでいくつかのブログを調べていますが、そのブログの1つで、作成者が使用して@Inject
おり、彼も使用できると思います@Autowired
。
コードは次のとおりです。
@Inject private CustomerOrderService customerOrderService;
との違いがわかりません。誰かが違い@Inject
を@Autowired
説明し、どのような状況でどちらを使用するかを説明していただければ幸いです。
ここで、javax.inject.Inject
注釈を参照していると仮定します。は、Java EE 6(JSR-299)で導入され@Inject
たJava CDI(Contexts and Dependency Injection )標準の一部です。詳細はこちらをご覧ください。Springは@Inject
、独自の注釈と同義の注釈の使用をサポートすることを選択しました@Autowired
。
だから、あなたの質問に答えるために、@Autowired
Spring自身の注釈があります。@Inject
Springと同様の依存性注入の標準を定義するCDIと呼ばれるJavaテクノロジーの一部です。Springアプリケーションでは、2つのアノテーションは、Springが独自のアノテーションに加えていくつかのJSR-299アノテーションをサポートすることを決定したのと同じように機能します。
これは、 、、およびを比較したブログ投稿で、かなり包括的な仕事をしているように見えます。@Resource
@Inject
@Autowired
リンクから:
テスト 2 と 7 を除いて、構成と結果は同じでした。内部を調べたところ、'@Autowired' と '@Inject' アノテーションの動作は同じであることがわかりました。これらのアノテーションは両方とも、「AutowiredAnnotationBeanPostProcessor」を使用して依存関係を注入します。「@Autowired」と「@Inject」は交換可能に使用して、Spring Bean を注入できます。ただし、「@Resource」アノテーションは「CommonAnnotationBeanPostProcessor」を使用して依存関係を注入します。これらは異なるポスト プロセッサ クラスを使用していますが、ほとんど同じように動作します。以下は、それらの実行パスの概要です。
著者が参照しているテスト 2 と 7 は、それぞれ「フィールド名による注入」と「不適切な修飾子を使用して Bean を解決しようとする試み」です。
結論は、必要なすべての情報を提供する必要があります。
配線がない状況を処理するために、@Autowired
required
属性が に設定されたBean を使用できますfalse
。
ただし、 を使用する@Inject
場合、Provider インターフェイスは Bean で動作します。つまり、Bean は直接注入されるのではなく、Provider で注入されます。
と の主な違い ( Spring Docsを読むときに気づいた)は@Autowired
、「必須」属性があるのに対し、@Inject には「必須」属性がないことです。@Inject
@Autowired
Spring 3.0 の時点で、Spring は JSR-330 依存性注入アノテーション ( @Inject
、@Named
、@Singleton
) のサポートを提供しています。
Spring のドキュメントには、Spring の同等物との比較を含む、それらに関する別のセクションがあります。
常に @Inject を使用することをお勧めします。アプリケーションをフレームワークにとらわれないようにするのは、Java 構成アプローチ (sun が提供) であるためです。したがって、春もあなたのクラスが機能します。
@Autowired を使用する場合、@Autowired はスプリング提供のアノテーションであるため、スプリングでのみ機能します。
上記に加えて:
@Autowired
Beanのデフォルトのスコープはシングルトンですが、JSR 330@Inject
アノテーションを使用すると、 Spring のプロトタイプのようになります。@Inject
。@Inject
。@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
が定義されます)。
@Inject
「必須」属性がありません