Dagger2 進階 (四)
組織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沒有標記作用域,就不影響。