本系列博客主要用於本身學習積累,順便幫助新手入門,若有問題,多多包涵。更詳細的一些使用能夠看看其餘更加詳細的博客。android
dagger android 學習(一):dagger基礎使用
dagger android 學習(二):AndroidInjector的使用
dagger android 學習(三):ContributesAndroidInjector的進一步優化
dagger android 學習(四):基於dagger2的mvp架構git
上篇文章講述了,若是在baseActivity中調用inject方法實現依賴注入,可是這種須要重複的建立ActivityModule和ActivitySubcomponent類,好在dagger2提供了@ContributesAndroidInjector註解解決了這個問題,下面介紹如何使用@ContributesAndroidInjector註解。github
首先全部的代碼基於上篇文章中的demo來改,重複的東西就不在論述了。架構
刪除以前demo中的MainActivitySubcomponent和MainActivityModuleapp
相比於以前的AndroidInjector,以前是基於具體的XXXActivity,此次則是BaseActivitypost
@Subcomponent(modules = [AndroidInjectionModule::class])
interface ActivityComponet: AndroidInjector<BaseActivity>{
//每個繼承BaseActivity的Activity,都共享同一個SubComponent
@Subcomponent.Builder
abstract class Builder: AndroidInjector.Builder<BaseActivity>()
}
複製代碼
新建一個ActivityModule類,管理全部Activity,而且加上@ContributesAndroidInjector註解便可。學習
@Module(subcomponents = [ActivityComponet::class])
abstract class ActivityModule{
@ContributesAndroidInjector(modules = [ABModule::class])
abstract fun mainActivityInjector(): MainActivity
@ContributesAndroidInjector(modules = [ABModule::class])
abstract fun main2ActivityInjector(): Main2Activity
}
複製代碼
刪除以前的XXXActivityModule,替換爲新的ActivityModule優化
@Component(modules = {
AndroidInjectionModule.class,
AndroidSupportInjectionModule.class,
ActivityModule.class
})
public interface MyAppComponent {
@Component.Builder
interface Builder {
MyAppComponent build();
}
void inject(MyApplication application);
}
複製代碼
@ContributesAndroidInjector註解的功能其實就是直接幫咱們重建了重複的模板代碼,咱們能夠執行make project,以後咱們即可以找到dagger自動建立的一個類ActivityModule_MainActivityInjector:ui
@Module(subcomponents = ActivityModule_MainActivityInjector.MainActivitySubcomponent.class)
public abstract class ActivityModule_MainActivityInjector {
private ActivityModule_MainActivityInjector() {}
@Binds
@IntoMap
@ClassKey(MainActivity.class)
abstract AndroidInjector.Factory<?> bindAndroidInjectorFactory(
MainActivitySubcomponent.Builder builder);
@Subcomponent(modules = ABModule.class)
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
}
複製代碼
很顯然這個類和咱們以前刪去的類是同樣的,這也就是爲何@ContributesAndroidInjector註解能夠幫咱們節省不少代碼。
demo地址:查看項目中的app-version2模塊spa