【发布时间】:2018-02-22 03:46:39
【问题描述】:
我正在阅读 this 很棒的教程,该教程解释了 @Component.Builder 如何在 Dagger 2 中工作。作者做得很好,文章直截了当,但我仍然需要澄清一些令人困惑的地方:默认实现Dagger 2 看起来像这样:
组件:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
SharedPreferences getSharedPrefs();
}
模块:
@Module
public class AppModule {
Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
Application providesApplication() {
return application;
}
@Provides
@Singleton
public SharedPreferences providePreferences() {
return application.getSharedPreferences(DATA_STORE,
Context.MODE_PRIVATE);
}
}
组件实例化:
DaggerAppComponent appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this)) //this : application
.build();
根据文章,我们可以通过避免使用@Component.Builder 和@BindsInstance 注释向模块构造函数传递参数来进一步简化这段代码,那么代码将如下所示:
组件:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
SharedPreferences getSharedPrefs();
@Component.Builder
interface Builder {
AppComponent build();
@BindsInstance Builder application(Application application);
}
}
模块:
@Module
public class AppModule {
@Provides
@Singleton
public SharedPreferences providePreferences(
Application application) {
return application.getSharedPreferences(
"store", Context.MODE_PRIVATE);
}
}
以及组件实例化:
DaggerAppComponent appComponent = DaggerAppComponent.builder()
.application(this)
.build();
上面的代码我差不多明白了,但我不明白的部分是:当我们实例化组件时,我们是如何从appModule(new AppModule(this)) 到application(this) 的?
我希望问题很清楚,谢谢。
【问题讨论】:
标签: android components dagger-2