提供方法依赖

Provide method dependendies

在文档中它说@Provides 方法可能有自己的依赖关系,比如:

@Provides Pump providePump(Thermosiphon pump) {
  return pump;
}

如果我这样写会有什么变化:

@Provides Pump providePump() {
  return new Thermosiphon();
}

在第一个片段中:该方法从哪里获得泵?

文档还显示 Thermosiphon class:

class Thermosiphon implements Pump {
  private final Heater heater;

  @Inject
  Thermosiphon(Heater heater) {
    this.heater = heater;
  }

  ...
}

这个class的构造函数用@Inject注释。这让 Dagger 知道在需要 Thermosiphon 时使用此构造函数,并自动为其提供 Heater 实例,因此您不必这样做。

您自己创建一个新的 Thermospihon 实例是完全可以的,但是 Dagger 这样做可以省去您的麻烦。例如,如果您手动执行此操作,则需要从某处获取一些 Heater 引用。这就是 Dagger 的全部意义所在,因此您不必进行繁琐的重复性工作。

这些实际上是相同的 IF 每次请求实例时都会创建 Thermosiphon.class 的新实例。如果它是单例(或以任何方式限定范围),那么我们就会有所不同。

如果您有以下情况,那么第一个示例是单例的别名。但是,第二个示例每次仍会创建新实例。

@Provides
@Singleton
Thermosiphon provideThermosiphon() {
  return new Thermosiphon();
}



就我个人而言,我更喜欢第一种方法。使用第一种方法,您可以稍后添加或更改提供程序,并在实例传递给别名之前调整实例的范围或状态。好像灵活了一点。

它会查找在您的模块中声明的其他 bean

例如:

@Module
public class MainModule {


    @Provides
    public EmailServiceApiGateway provideEmailServiceApiGateway() {
        return new EmailServiceApiGateway();
    }

    @Provides
    public EmailSendingActivityPresenter provideEmailSendingActivityPresenter(EmailServiceApiGateway emailServiceApiGateway) {
        return new EmailSendingActivityPresenterImpl(emailServiceApiGateway);
    }
}

因此在上述情况下,EmailServiceApiGateway 会自动注入 EmailSendingActivityPresenter。