关于Dagger 二、@inject 和@provide 的联系

About Dagger 2. Connection of @inject and @provide

有@inject就一定有@provide? inject 字段从模块的@provide 方法获取它的值?

如果有@Inject 注解那么它的依赖可以通过两种方式提供:

通过使用在模块中提供注解

@Provides
    TasksPresenter provide TasksPresenter(TasksRepository tasksRepository, TasksContract.View tasksView) {
        return new TasksPresenter(tasksRepository,tasksView);
}

通过构造函数注入

 @Inject
    TasksPresenter(TasksRepository tasksRepository, TasksContract.View tasksView) {
        mTasksRepository = tasksRepository;
        mTasksView = tasksView;
    }

这里要注意的一件事是构造函数注入解决了两件事

  • 实例化对象
  • 通过将对象添加到对象图来提供对象。

是的,如果你使用模块

@Module
public class SomeModule {
    @Provides
    Unscoped unscoped() {
        return new Unscoped();
    }

    @Provides
    @Singleton
    Scoped scoped() {
        return Scoped();
    }
}

BUT 类 with @Inject 构造函数会自动附加到您的作用域组件,即使没有为其指定模块也是如此:

@Singleton
public class Scoped {
    @Inject
    public Scoped() {
    }
}

public class Unscoped {
    @Inject
    public Unscoped() {
    }
}