GithubApp中DispatchingAndroidInjector<Activity>注入過程及作用

Application的子類GithubApp實現了HasActivityInjector接口,持有一個被@Inject標記的DispatchingAndroidInjector<Activity> 引用,由activityInjector()提供給外界。(這個類的作用是什么?)
dagger的入口是GithubApp中調用的如下方法:
AppInjector.init(GithubApp githubApp)
與該對象注入有關的是下面一段代碼:

DaggerAppComponent.builder().application(githubApp)
                .build().inject(githubApp);

DaggerAppComponent類是dagger框架根據AppComponent生成的,相關注解的學習不是本次學習重點。
該類中initialize()給眾多對象做了一系列初始化,閱讀過程中一系列Builder,Factory接口的流轉讀起來可能感覺吃力,實際上很簡單,經過我的梳理,主要的注入流程是這樣的:

this.mainActivitySubcomponentBuilderProvider =
        new dagger.internal.Factory<
            MainActivityModule_ContributeMainActivity.MainActivitySubcomponent.Builder>() {
          @Override
          public MainActivityModule_ContributeMainActivity.MainActivitySubcomponent.Builder get() {
            return new MainActivitySubcomponentBuilder();
          }
        };

this.bindAndroidInjectorFactoryProvider = (Provider) mainActivitySubcomponentBuilderProvider;
this.mapOfClassOfAndProviderOfFactoryOfProvider =
        MapProviderFactory
            .<Class<? extends Activity>, AndroidInjector.Factory<? extends Activity>>builder(1)
            .put(MainActivity.class, bindAndroidInjectorFactoryProvider)
            .build();
this.dispatchingAndroidInjectorProvider =
        new DispatchingAndroidInjector_Factory<T>(mapOfClassOfAndProviderOfFactoryOfProvider);
this.githubAppMembersInjector =
        new GithubApp_MembersInjector(dispatchingAndroidInjectorProvider);
githubAppMembersInjector.injectMembers(githubApp);

最后實際調用了GithubApp_MembersInjectorinjectMembers(GithubApp),該方法里直接進行賦值,這也解釋了為什么被注入的屬性不可以使用private:

instance.dispatchingAndroidInjector = dispatchingAndroidInjectorProvider.get();

dispatchingAndroidInjectorProviderDispatchingAndroidInjector_Factory的實例,它的get() 返回 DispatchingAndroidInjector實例:

return new DispatchingAndroidInjector<T>(injectorFactoriesProvider.get());;

這就是GithubApp持有的實際引用啦。它又用在哪里呢?
在AppInjector中,監聽到Activity創建后,調用了AndroidInjection.inject(activity);這個方法內部就是調用了
GithubApp持有的DispatchingAndroidInjector<Activity>
最終調用了MainActivity_MembersInjector.injectMembers()為MainActivity注入兩個屬性:

    instance.dispatchingAndroidInjector = dispatchingAndroidInjectorProvider.get();
    instance.navigationController = navigationControllerProvider.get();

總結:

GithubApp_MembersInjector
DispatchingAndroidInjector_Factory.get()內部調用:
new DispatchingAndroidInjector<T>(injectorFactoriesProvider.get());
這里的injectorFactoriesProvider是:

DispatchingAndroidInjector_Factory.create(MapProviderFactory
            .<Class<? extends Activity>, AndroidInjector.Factory<? extends Activity>>builder(1)
            .put(MainActivity.class, bindAndroidInjectorFactoryProvider)
            .build());

反思:

1.通過這次梳理,我發現我注重于尋找最終實際調用和被調用者,沒有對于中間流轉的過程有重視,關注,和思考。
中間的過程流轉有什么優點?為什么是這種形式?解決了什么問題?
2.Java范型基礎,特別是范型用于方法時的用法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容