我有下面的代码来使用 Guice 进行依赖注入(inject)。第一个是使用构造函数注入(inject),而另一个是直接在字段上方添加 @Inject
。这两种方式有什么区别吗? Guice官网似乎推荐构造函数注入(inject)。
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() {
}
...
}
最佳答案
我要指出的差异:
- 如果没有构造函数注入(inject),您将无法使用
final
修饰符,即您上面的代码将无法编译。在这里评论最终成员的优势是题外话。 - 使用构造函数注入(inject),所有依赖项都是强制性的。如果不知道每个声明的依赖项,您将无法实例化该类。
- 使用构造函数注入(inject)编写测试用例可能会更容易(参见 The111 的答案)。
- 还有另一种类型的 DI - setter 注入(inject) - 它可以更自然地与构造函数注入(inject)混合(例如,用于分离强制和可选依赖项)。
关于dependency-injection - 通过构造函数注入(inject)和通过 Guice 的字段注解注入(inject)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966662/