私はSpringSourceのいくつかのブログを調べています。そのうちの1つのブログでは、著者が使用して@Injectおり、彼もを使用できると思います@Autowired。
これがコードの一部です:
@Inject private CustomerOrderService customerOrderService;
私は違いではないと確信している@Injectと@Autowired、誰かがその違いを説明している場合、それを感謝し、どちらがどのような状況の下で使用しますか?
私はSpringSourceのいくつかのブログを調べています。そのうちの1つのブログでは、著者が使用して@Injectおり、彼もを使用できると思います@Autowired。
これがコードの一部です:
@Inject private CustomerOrderService customerOrderService;
私は違いではないと確信している@Injectと@Autowired、誰かがその違いを説明している場合、それを感謝し、どちらがどのような状況の下で使用しますか?
回答:
ここでjavax.inject.Inject注釈を参照していると仮定します。@InjectJavaのCDI(の一部であり、コンテキストと依存性注入)は、Java EE 6(JSR-299)に導入された標準、続きを読むには。Springは@Inject、独自の@Autowiredアノテーションと同じ意味での使用をサポートすることを選択しました。
だから、あなたの質問に答えるの@Autowiredは、Spring自身の注釈です。@InjectSpringと同様の依存性注入の標準を定義するCDIと呼ばれる新しいJavaテクノロジーの一部です。Springアプリケーションでは、2つのアノテーションは、Springが独自のアノテーションに加えていくつかのJSR-299アノテーションをサポートすることを決定したのと同じように機能します。
@InjectCDI(JSR-299)とは別のJSR(JSR-330)です。
@InjectJSRアノテーションを使用@Autowiredする場合は、Spring DIでコードベースをロックするよりも優れています。
@Inject単独で使用しても、フレームワークの独立性は保証されません。また、Spring @Componentやのようなフレームワークに依存するメカニズムなしでインジェクション可能なBeanを宣言する必要application.xmlがありますが@Named、@Singletonクラスレベルで使用します。今日、Springプロジェクトが実際にそのようなBeanを宣言しているかどうかはわかりません。SpringからJEEに移行したプロジェクトについて聞いたことがありません...
ここにあるブログの記事を比較@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 3.0以降、SpringはJSR-330依存性注入アノテーション(@Inject、@Named、@Singleton)。
Springのドキュメントには、対応するSpringとの比較を含めて、それらに関する別個のセクションがあります。
(読み込み時に気づいた主な違い春のドキュメントを間)@Autowiredと@Injectそれである、@Autowired@Injectは何の属性を「必要な」いながら、「必要な」属性を持っていません。
@Autowired(required=false)。簡単に言うと、 「required属性は、プロパティが自動配線には必要ないことを示します。自動配線できない場合、プロパティは無視されます。」
常に@Injectを使用することをお勧めします。私たちのアプリケーションがフレームワークにとらわれないようにするのは、Java構成アプローチ(Sun提供)だからです。だからあなたが春ならあなたのクラスもうまくいきます。
@Autowiredを使用する場合、@ AutowiredはSpring提供のアノテーションであるため、Springでのみ機能します。
@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が定義されます)。
@Inject 「必須」属性はありません
上記に加えて:
@AutowiredBean のデフォルトのスコープはシングルトンですが、JSR 330 @Injectアノテーションを使用すると、Springのプロトタイプのようになります。ます。@Inject。@Inject。