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_MembersInjector
的injectMembers(GithubApp)
,該方法里直接進行賦值,這也解釋了為什么被注入的屬性不可以使用private:
instance.dispatchingAndroidInjector = dispatchingAndroidInjectorProvider.get();
dispatchingAndroidInjectorProvider
是DispatchingAndroidInjector_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范型基礎,特別是范型用于方法時的用法。