2016-11-30 12 views
0

私はこのような@Autowired注釈を使用します。@Autowired注釈は正しく使用されていますか?

@Autowired 
private MyService1 myService1; 

@Autowired 
private MyService2 myService2; 

しかし、新しいのIntelliJ IDE 2016(3)提案して交換することを提案している:

private final MyService1 myService1; 
private final MyService2 myService2;; 

@Autowired 
public MyClass(MyService1 myService1, MyService2 myService2) { 
    this.myService1= myService1; 
    this.myService2= myService2; 
} 

は違い、何の権利であるが、何を教えてくださいましたか?

+1

[Setter DIとコンストラクタDIの春の可能な複製?](http://stackoverflow.com/questions/7779509/setter-di-vs-constructor-di-in-spring) – Jesper

答えて

1

どちらの方法も正しいです。 docs

春はあなたがセッター・インジェクションを使用する場合、すべての依存関係が定義されていることを保証するためのメカニズムを提供し、含まれていますが、コンストラクタ・インジェクションを使用することによって、あなたはコンテナに依存しない方法で、依存関係の要件を主張から

「あなたの春のコンテナが最終的にそのクラスのためのあなたのBeanを作成するときに必要なすべての依存関係を持つことになりますコンストラクタレベルの保証で

@Autowire

1

セッター注入の代わりにコンストラクター注入を使用することに変わりはありません。通常の使用の場合、大きな違いはありません。

通常、他のすべてのプロパティのすべての必須協力者とセッタ注入について、コンストラクタ注入を使用することをおすすめします。繰り返しになりますが、コンストラクタインジェクションでは、すべての必須プロパティが満たされていることが保証されます。オブジェクトを無効な状態でインスタンス化することはできません。つまり、コンストラクタインジェクションを使用する場合、(通常のJavaメカニズム以外の)必須のプロパティが設定されていることを確認するために専用のメカニズムを使用する必要はありません。ここで

はまた、あなたはstackoverflowの中に非常に多くの質問/答えを得ることができ、それをSetter injection versus constructor injection and the use of @Required

を説明するための記事です。 Setter DI vs. Constructor DI in Spring?

0

はい、正しく使用されます。これはコンストラクタインジェクションと呼ばれます。

コンストラクタインジェクションを使用すると、finalモディファイアを使用して、Springオブジェクト(モックなど)によって管理されていない独自のものを簡単に渡すことができます。

フィールド注入を強制されない場合は、コンストラクタ注入を選択します。

関連する問題