Spring Frameworkの@Injectと@Autowiredの違いは何ですか?どの条件の下でどちらを使用しますか?


695

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

これがコードの一部です:

@Inject private CustomerOrderService customerOrderService;

私は違いではないと確信している@Inject@Autowired、誰かがその違いを説明している場合、それを感謝し、どちらがどのような状況の下で使用しますか?


3
私はあまりにもこれに新たなんだから、答えを持っていますが、このかもしれないのヘルプはありませんsakaenakajima.wordpress.com/2010/08/10/...
サーガルV


2
「@Inject」と「@Autowired」の違いについては、この記事で詳しく
Alex Theedom

回答:


719

ここでjavax.inject.Inject注釈を参照していると仮定します。@InjectJavaのCDI(の一部であり、コンテキストと依存性注入)は、Java EE 6(JSR-299)に導入された標準、続きを読むには。Springは@Inject、独自の@Autowiredアノテーションと同じ意味での使用をサポートすることを選択しました。

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


115
したがって、理論的には、@ Injectを使用した場合、SpringをGuiceなどの別のDIフレームワークに置き換え、同じ方法で依存関係を注入できます。
Alex Barnes 2012年

71
知識を失う危険性がある:@InjectCDI(JSR-299)とは別のJSR(JSR-330)です。
Brad Cupit 2013年

36
JSR- *アノテーションのみに依存している場合は、DIフレームワークを置き換えることができます。しかし、あなたはしますか?Springの使用を開始すると、DIだけでなく、Springの多くを使用した可能性があります。変更を加えるだけではありません。たとえそうしたとしても、その動きを成し遂げるか、壊すのは、いくつかの検索と置換ではありません。一方、Spring独自のアノテーションは、より多くの機能を提供します。優れたフレームワークを習得すれば、多くのフレームワークをほとんど使用するよりも多くのことが得られます。
Agoston Horvath 2015

18
私は、DIフレームワークを頻繁に変更しないことに同意します。ただし、ソースコードに複数のパッケージがあり、複数のプロジェクト間で共有する共通のパッケージをビルドして、@InjectJSRアノテーションを使用@Autowiredする場合は、Spring DIでコードベースをロックするよりも優れています。
Aditya 2016

3
@Inject単独で使用しても、フレームワークの独立性は保証されません。また、Spring @Componentやのようなフレームワークに依存するメカニズムなしでインジェクション可能なBeanを宣言する必要application.xmlがありますが@Named@Singletonクラスレベルで使用します。今日、Springプロジェクトが実際にそのようなBeanを宣言しているかどうかはわかりません。SpringからJEEに移行したプロジェクトについて聞いたことがありません...
Marcus K.

162

ここにあるブログの記事を比較@Resource@Injectおよび@Autowired、とかなり包括的な仕事をするように見えます。

リンクから:

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

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

結論から、必要なすべての情報が得られます。


4
この記事は、3つの注釈のすばらしい説明です。私は最初のスワイプの後でそれを再読する必要があった。しかし、優れた記事。
Thomas

1
どうもありがとう!この記事は、SpringとJavaEEの相違点と類似点を見つけるための私の回答の複数と、私が持っていた他のいくつかの質問に回答しました。
Kevin Cruijssen、2016年

36

ワイヤリングがない状況を処理するために、@Autowired required属性がに設定されたBeanを使用できますfalse

ただし、を使用する@Inject場合、ProviderインターフェースはBeanで機能します。つまり、Beanは直接インジェクションされず、Providerで注入されます。


8
これは非常に重要であり、最も支持されている回答では見落とされてきました。
Igor Donin '20年

Autowiredのデフォルトでは、必須パラメーターはtrueに設定されています。参照:docs.spring.io/spring-framework/docs/current/javadoc-api/org/…–
穏やかな

25

Spring 3.0以降、SpringはJSR-330依存性注入アノテーション(@Inject@Named@Singleton)。

Springのドキュメントには、対応するSpringとの比較を含めて、それらに関する別個のセクションがあります。


ここで質問、SpringがJSRをサポートしているとはどういう意味ですか?コンテナーはSpringから独立したJSRをサポートしておらず、コンテナーがJ2EEに準拠している必要がありますか?それは機能をラップするということですか?Springが「サポート」しなかった場合でも、javaxからの注釈はデフォルトで機能しませんか?
Dan Chase

JEEコンテナーでSpringを実行することは必須ではありません。Tomcatのようなサーブレット/ JSPコンテナーでSpringを使用して、JSR-330をサポートすることもできます。Springは独立したDIコンテナーであり、CDI BeanがホストJEEサーバーと「交換」されない場合は、その意味は変わりません。JEEコンテナーでCDIを使用することも、Spring Beanを使用することもできますが、両方を使用することはできません(そのまま)。
Andre Steingress、2017

22

(読み込み時に気づいた主な違い春のドキュメントを間)@Autowired@Injectそれである、@Autowired@Injectは何の属性を「必要な」いながら、「必要な」属性を持っていません。


必要とはどういう意味ですか?
マットマン2016年

2
@mattymanmeドキュメントから、「デフォルトでは、候補Beanがゼロになると自動配線は失敗します。デフォルトの動作は、アノテーション付きメソッド、コンストラクター、およびフィールドを必要な依存関係を示すものとして扱うことです。この動作は、required属性をfalseに設定することで変更できます。 」例:@Autowired(required=false)。簡単に言うと、 required属性は、プロパティが自動配線には必要ないことを示します。自動配線できない場合、プロパティは無視されます。」
ラッキー

ソースコードを調べますpublic interface Autowired {/ ** *注釈付きの依存関係が必要かどうかを宣言します。* / boolean required()default true; }パブリックインターフェイスを注入{}
Tarnの

15

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

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


13
太陽は死んだ。太陽を長持ちさせる。
Amrinder Arora 2016

6
どのくらいの頻度でフレームワークを変更しますか?ちょうど好奇心が強い
ケイ

ほとんどのプロジェクトで、InjectではなくAutowiredを見ました。回答の論理的根拠は理解していますが、賛成できません。
Witold Kaczurba

13

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

@Injectアノテーションは、標準の「Dependency Injection for Java」(JSR-330)で定義されている標準のアノテーションです。Spring(バージョン3.0以降)は、標準のJSR-330で定義されている依存関係注入の一般化モデルをサポートしています。(Google GuiceフレームワークPicocontainerフレームワークもこのモデルをサポートしています)。

を使用して@InjectProviderインターフェースの実装への参照を挿入できます。これにより、遅延参照を挿入できます 。

注釈@Inject@Autowired-は、ほぼ完全な類似です。@Autowiredアノテーションと同様に、@Injectアノテーションは自動バインディングのプロパティ、メソッド、およびコンストラクターに使用できます。

アノテーションとは対照的に@Autowired@Injectアノテーションにはrequired属性がありません。したがって、依存関係が見つからない場合は、例外がスローされます。

バインディングプロパティの明確化にも違いがあります。インジェクション用のコンポーネントの選択に曖昧さがある場合は、@Named修飾子を追加する必要があります。@Autowiredアノテーションの同様の状況では、@Qualifier修飾子が追加されます(JSR-330は独自の@Qualifierアノテーションを定義し、この修飾子を介してアノテーション@Namedが定義されます)。


「@Inject」には必須属性がありませんが、Javaドキュメントの状態:「@Inject」で注釈が付けられたメンバーの挿入が必要です。これは、メンバーが見つからない場合、その注入が失敗することを意味するようです。Javaドキュメントを参照してください:docs.oracle.com/javaee/7/api/javax/inject/Inject.html
Alex Theedom


12

上記に加えて:

  1. @AutowiredBean のデフォルトのスコープはシングルトンですが、JSR 330 @Injectアノテーションを使用すると、Springのプロトタイプのようになります。ます。
  2. を使用したJSR 330には@Lazyに相当するものはありません@Inject
  3. を使用するJSR 330には@Valueに相当するものはありません@Inject

0

@Inject注釈は、JSR-330のアノテーションのコレクションの一つです。これには、タイプによる一致、修飾子による一致、名前による一致の実行パスがあります。これらの実行パスは、セッターとフィールドインジェクションの両方に有効です。@Autowiredアノテーションの動作はアノテーションと同じ@Injectです。唯一の違いは、@AutowiredアノテーションがSpringフレームワークの一部であることです。@Autowiredアノテーションにも上記の実行パスがあります。だから私@Autowiredはあなたの答えをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.