組織Component
Component之間的關係有 依賴(dependencies),包含(SubComponent),繼承方式(extends)。我們在一個項目之中不可能只使用一個Component連接器來注入對象完成注入工作,一般除了一個全局的ApplicationComponent之外,還有一些作用域在Activity/Fragment的Component,Component之間存在依賴關係與從屬關係。如果我們已經創建好了一個全局的ApplicationComponent,然後其它的Component剛好需要ApplicationComponent裏面的一個全局屬性,想要與ApplicationComponent共享同一個實例,這時就需要用到依賴關係了。
依賴方式
一個Component可以依賴一個或多個Component,並拿到被依賴Component暴露出來的實例,Component的dependencies屬性就是確定依賴關係的實現。
這裏的有點像數學裏面的交集方式,被依賴的Component主動暴露對象給二者共享,如我們在ApplicationModule提供了一個全局的Gson對象,我們想要提供給其他Component時,要在ApplicationComponent顯式的提供一個接口:
@PreApp
@Component (modules = AppModule.class)
public interface AppComponent {
void inject(BaseActivity baseActivity);
Context context();
}
@Module
public class AppModule {
private AppApplication application;
public AppModule(AppApplication application) {
this.application = application;
}
@Provides @PreApp Context provideContext(){
return application;
}
}
activity對應的component修改
@PreActivity
@Component(dependencies = AppComponent.class ,modules = MainActivityModule.class)
public interface MainActivityComponent {
void inject(MainActivity mainActivity);
}
//注入
component = DaggerMainActivityComponent.builder()
.appComponent(AppApplication.getAppComponent())
.mainActivityModule(new MainActivityModule())
.build();
component.inject(this);
包含方式(從屬方式)@SubComponent
如果我們需要父組件全部的提供對象,這時我們可以用包含方式而不是用依賴方式,相比於依賴方式,包含方式不需要父組件顯式顯露對象,就可以拿到父組件全部對象。且SubComponent只需要在父Component接口中聲明就可以了。
繼承方式
用一個Component繼承另外一個Component。
注意
- Component依賴另一個Component,它們的作用域不能相同。
- 包含的方式,作用域可以與包含它的Component一致。
- Component的作用域必須與對應的Module作用域一致,如果@Module沒有標記作用域,就不影響。