私はSpringSourceでいくつかのブログを読み進めていますが、そのうちの1つのブログでは、作者は@Inject
を使用していますが、@Autowired
も使用できると思います。
これがそのコードです。
@Inject private CustomerOrderService customerOrderService;
私は@Inject
と@Autowired
の違いについて確信が持てませんし、誰かが彼らの違いを説明し、どの状況下でどちらを使用するべきかを説明してくれたらありがたいですか?
ここでは、 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アノテーションをサポートすることを決定したのと同じように機能します。
これは@Resource
、@Inject
、そして@Autowired
を比較した ブログ投稿 で、かなり包括的な仕事をしているようです。
リンクから:
テスト2と7を除いて、構成と結果は同じでした。ボンネットの裏側を見ると、 '@ Autowired'アノテーションと '@Inject'アノテーションは同じように動作することがわかりました。これらのアノテーションはどちらも依存関係を注入するために「AutowiredAnnotationBeanPostProcessor」を使用します。 「@Autowired」と「@Inject」は、Spring Beanを注入するために互換的に使用できます。ただし、「@ Resource」アノテーションは「CommonAnnotationBeanPostProcessor」を使用して依存関係を注入します。異なるポストプロセッサクラスを使用していても、それらはすべてほぼ同じように動作します。以下はそれらの実行パスの要約です。
作成者が参照するテスト2および7は、それぞれ「フィールド名による注入」および「不適切な修飾子を使用したBeanの解決の試み」です。
結論はあなたがあなたが必要とするすべての情報をあなたに与えるべきです。
配線がない状況を処理するために、@Autowired
required
属性をfalse
に設定したBeanを使用できます。
ただし、@Inject
を使用する場合、ProviderインタフェースはBeanと連携します。つまり、Beanは直接注入されるのではなく、Providerと注入されます。
Spring 3.0以降、SpringはJSR-330依存性注入アノテーション(@Inject
、@Named
、@Singleton
)のサポートを提供します。
それらについては Springのドキュメントには別セクション があり、それらのSpringに相当するものとの比較も含まれています。
@Autowired
と@Inject
の主な違い( Spring Docs を読むときに気付かれる)は、@Autowired
は 'required'属性を持ち、@Injectは 'required'属性を持たないことです。
常に@Injectを使用してください。なぜなら、私たちのアプリケーションをフレームワークにとらわれないのは、(Sunが提供する)Java構成アプローチだからです。だから春になってもあなたのクラスはうまくいくでしょう。
@Autowiredを使用する場合は、@AutowiredはSpringが提供する注釈であるため、Springでのみ機能します。
@Inject
には 'required'属性がありません
@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
が定義されます).
上記に加えて:
prototype
のようになります。@Inject
アノテーションはJSR-330アノテーションコレクションの1つです。これには、タイプによる一致、修飾子による一致、名前による一致の実行パスがあります。これらの実行パスは、セッター注入とフィールド注入の両方に有効です。@Autowired
アノテーションの動作は、@Inject
アノテーションと同じです。唯一の違いは、@Autowired
アノテーションがSpringフレームワークの一部であるということです。 @Autowired
アノテーションにも上記の実行パスがあります。だから私はあなたの答えに@Autowired
を推薦します。