2016-12-05 3 views
3

У меня есть код ниже, чтобы сделать инъекцию зависимости, используя Guice. Первый использует инжектор конструктора, а другой добавляет @Inject непосредственно над полем. Есть ли разница между этими двумя способами? Кажется, что инъекция конструктора рекомендуется на официальном сайте 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

Вот одна разница. В последнем случае инъекция - это единственный способ полностью построить экземпляр BillingService. Если по какой-либо причине вам нужно построить один без инъекции, вы не сможете (используя показанные методы, по крайней мере).

В первом случае, вы можете построить один старинке, если у вас есть какая-то причина, чтобы хотеть сделать это:

new BillingService(someProcessor, someLog); 

Я работал в одной команде, что сделал это один из способов, и другой, который сделал это по-другому. В большинстве случаев я использовал инъекции все время, даже для теста. Но каждый раз в единичном тесте я считаю удобным создание чего-то не-Guicy-way, и в тех случаях инъекция конструктора действительно покупает вам такую ​​гибкость.

Смежные вопросы