Java 了解Dagger2流程(提供样本)
我正试图在我的项目中使用Dagger2来改进RxJava和MVP实现。然而,我从阅读指南和观看视频开始,就在我认为我了解它是如何工作的时候,似乎我不知道。这就是我想要了解的样本 模块:Java 了解Dagger2流程(提供样本),java,android,dependency-injection,rx-java,dagger-2,Java,Android,Dependency Injection,Rx Java,Dagger 2,我正试图在我的项目中使用Dagger2来改进RxJava和MVP实现。然而,我从阅读指南和观看视频开始,就在我认为我了解它是如何工作的时候,似乎我不知道。这就是我想要了解的样本 模块: @Module public class AppModule { private App app; public AppModule(App app) { this.app = app; } @Provides @Singleton public SharedPreferences p
@Module
public class AppModule {
private App app;
public AppModule(App app) {
this.app = app;
}
@Provides @Singleton public SharedPreferences provideSharedPreferences() {
return PreferenceManager.getDefaultSharedPreferences(app);
}
@Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider,
HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) {
return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock);
}
@Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) {
return new HelloDiskCache(prefs);
}
@Provides public HelloService provideHelloService() {
return new HelloService();
}
@Provides public SchedulerProvider provideSchedulerProvider() {
return SchedulerProvider.DEFAULT;
}
@Provides public Clock provideClock() {
return Clock.REAL;
}
@Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() {
return null;
}
组成部分
@Component(
modules = AppModule.class
)
@Singleton
public interface AppComponent {
HelloModel getHelloModel();
HelloDiskCache getHelloDiskCache();
MainActivity inject(MainActivity activity);
HelloFragment inject(HelloFragment fragment);
}
在片段中,演示者被注入(这是从哪里来的?)
在演示者中,有一个构造函数注入
@Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;
}
那么,为什么我们可以在片段中注入演示者,为什么我们可以注入演示者?答案不必太详细,我只是觉得自己很愚蠢,因为我无法追踪它的来源。
@Inject
-带注释的构造函数是@的替代方法,它为依赖项提供了带注释的方法,而无需进行太多配置
由于HelloPresenter
有这样的构造函数,Dagger会自动发现它,并能够注入此依赖项,或使用它来构造和提供图形中的其他对象
带有@Inject
-注释构造函数的类本身可以用范围注释(例如,@Singleton
)注释。在这种情况下,只有具有匹配作用域的组件才能看到它
一般来说,这种提供依赖关系的类型不太详细,但并非总是可以使用它(例如,活动
,共享引用
)。在这种情况下,您必须使用@模块
,并且@提供了
方法。您可以查看此示例,其中Dagger2与MVP架构一起使用
嗯,我明白了,在阅读了一些教程之后,我有一种印象,那就是组件中需要提到注入发生的所有位置,但这只适用于您调用的位置,例如App.getAppComponent(getActivity())。例如,在片段中注入(this)。我想我的问题是理解为什么我可以在不在组件中的类中使用@Inject,而不在oncreate中执行Inject操作。@buddhabath在字段和构造函数上使用@Inject
注释可能会有一些混淆,这是完全不同的。使用@Inject
注释字段时,确实需要调用App.getAppComponent(getActivity()).Inject(this)
以满足此依赖关系。另一方面,当您注释构造函数时,您告诉Dagger,如果它在其图形创建活动中需要该类,它可以使用该构造函数。没有办法不调用…inject(这个)活动中的
,因为您无法访问其构造函数,也无法将其字段作为构造函数参数提供。@Inject
注释构造函数的另一个优点是,它的参数是从图形中自动提供的,您通常使用它们填充类字段。在您的示例中,HelloPresenter(helloModel helloModel)
中的helloModel
是由组件中的provideHelloModel()
提供的,因为这两个依赖项提供程序对组件都是可见的。这会清除部分依赖项,但假设我在presenter中添加了一个字段。(我已经这样做了,我只是想知道为什么它会工作)在模块中,我创建了一个provideOmdbService,它返回一个改装.create(OmdbService.class),在presenter中,我注入了OmdbService,这是因为InjectMainPresenter构造函数。下面是我添加的内容的粘贴,基本上我只是在presenter中的一个按钮上调用refresh2
@Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;