2016-12-05 13 views
3

Guiceを使って依存性注入を行うには以下のコードがあります。最初のものはコンストラクタインジェクションを使用し、もう1つはフィールドのすぐ上に@Injectを追加しています。これらの2つの方法に違いはありますか? Guiceの公式サイトではコンストラクタインジェクションが推奨されるようです。コンストラクタによる注入とGuiceによるフィールド注釈による注入の違いは何ですか?

class BillingService { 
    private final CreditCardProcessor processor; 
    private final TransactionLog transactionLog; 

    @Inject 
    BillingService(CreditCardProcessor processor, TransactionLog transactionLog) { 
     this.processor = processor; 
     this.transactionLog = transactionLog; 
    } 
    ... 
} 

そして:

class BillingService { 
    @Inject 
    private final CreditCardProcessor processor; 
    @Inject 
    private final TransactionLog transactionLog; 
    BillingService() { 

    } 
    ...  
} 

答えて

4

違い:

  • コンストラクタ・インジェクションのないあなたはfinal修飾子を使用することはできません、すなわち、あなたのコードは、上記のコンパイルされません。最終メンバーの利点をコメントするのはここで話題にはなりません。
  • コンストラクタを含むすべての依存関係は必須です。宣言されたそれぞれの依存関係について知らなくてもクラスをインスタンス化することはできません。
  • コンストラクタインジェクションのテストケースを書くほうが簡単かもしれません(The111の答えを参照してください)。
  • DIセッタ注入の別のタイプがあります。これは、より自然にコンストラクタ注入と混合することができます(たとえば、必須およびオプションの依存性を分離するため)。
4

ここに1つの違いがあります。後者の場合、注入はBillingServiceのインスタンスを完全に構築できる唯一の方法です。どんな理由であれ、注入なしで構築する必要がある場合は、(少なくとも示された方法を使用して)行うことはできません。前者の場合には

あなたがそれをやりたいためにいくつかの理由がある場合、あなたはまだ、1つの昔ながらの方法を構築することができます:

new BillingService(someProcessor, someLog); 

を、私はそれを一つの方法をした1人のチームで働いてきました、それを他の方法でやった別のもの。ほとんどの場合、テストのためにも、私は常に注射を使用しました。しかし、ユニットテストでは、しばらくして、私はそれが非Guicy方法を構築することが便利であることがわかります。その場合、コンストラクタインジェクションはあなたにその柔軟性を購入します。私がポイントでしょう

関連する問題