私はSpringSourceのいくつかのブログを調べています。そのうちの1つのブログでは、著者が使用して@Inject
おり、彼もを使用できると思います@Autowired
。
これがコードの一部です:
@Inject private CustomerOrderService customerOrderService;
私は違いではないと確信している@Inject
と@Autowired
、誰かがその違いを説明している場合、それを感謝し、どちらがどのような状況の下で使用しますか?
私はSpringSourceのいくつかのブログを調べています。そのうちの1つのブログでは、著者が使用して@Inject
おり、彼もを使用できると思います@Autowired
。
これがコードの一部です:
@Inject private CustomerOrderService customerOrderService;
私は違いではないと確信している@Inject
と@Autowired
、誰かがその違いを説明している場合、それを感謝し、どちらがどのような状況の下で使用しますか?
回答:
ここでjavax.inject.Inject
注釈を参照していると仮定します。@Inject
JavaのCDI(の一部であり、コンテキストと依存性注入)は、Java EE 6(JSR-299)に導入された標準、続きを読むには。Springは@Inject
、独自の@Autowired
アノテーションと同じ意味での使用をサポートすることを選択しました。
だから、あなたの質問に答えるの@Autowired
は、Spring自身の注釈です。@Inject
Springと同様の依存性注入の標準を定義するCDIと呼ばれる新しいJavaテクノロジーの一部です。Springアプリケーションでは、2つのアノテーションは、Springが独自のアノテーションに加えていくつかのJSR-299アノテーションをサポートすることを決定したのと同じように機能します。
@Inject
CDI(JSR-299)とは別のJSR(JSR-330)です。
@Inject
JSRアノテーションを使用@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
「必須」属性はありません
上記に加えて:
@Autowired
Bean のデフォルトのスコープはシングルトンですが、JSR 330 @Inject
アノテーションを使用すると、Springのプロトタイプのようになります。ます。@Inject
。@Inject
。