dependency-injection - 通过构造函数注入(inject)和通过 Guice 的字段注解注入(inject)有什么区别?

标签 dependency-injection guice

我有下面的代码来使用 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/

相关文章:

c# - 如何使用 Ninject 将拦截器添加到特定方法

java - 使用 Guice、枚举和静态工厂方法设计工厂框架

java - Guice 在 UI 线程问题之外创建 Swing 组件?

java - Dagger2 对待 @Singleton 和自定义 sopes 的方式有区别吗?

dependency-injection - 面试官问: "What' s the value of dependency injection?“

java - 配置 guice 进行基本字段注入(inject),无需 main 方法

java - 如何将单个实现绑定(bind)到 Guice 中的多个通用接口(interface)?

java - Guice 包装通用注入(inject)

unit-testing - 摆脱子组件对象的 'new' 运算符

c# - 注入(inject)依赖困境的工厂模式和生命周期