前言
这部分对前面的依赖非常大,这一部分的精华是Resolved解析:从component入口方法componentMethodEntryPoint开始,该入口方法的参数paramter作为当前需要注入实例的MembersInjectionObject对象,该MembersInjectionObject对象中使用的Inject修饰的变量或普通方法表示需要外部component容器实现实例化并且注入到MembersInjectionObject对象中的。
换成当前ComponentProcessor作为Demo来在描述一遍(灰常重要):
-
首先在ProcessorComponent接口中有一个inject方法表示入口方法:
void inject(ComponentProcessor processor);
-
该方法参数表示的ComponentProcessor对象,表示需要通过DI(依赖注入)方式实例化该对象中使用Inject修饰的变量:
@Inject InjectBindingRegistry injectBindingRegistry; @Inject SourceFileGenerator<ProvisionBinding> factoryGenerator; @Inject SourceFileGenerator<MembersInjectionBinding> membersInjectorGenerator; @Inject ImmutableList<XProcessingStep> processingSteps; @Inject ValidationBindingGraphPlugins validationBindingGraphPlugins; @Inject ExternalBindingGraphPlugins externalBindingGraphPlugins; @Inject Set<ClearableCache> clearableCaches;
- 注:e.g.这里@Inject修饰的InjectBindingRegistry和ValidationBindingGraphPlugins分别以该类型作为type生成key钥匙对象,拿着该钥匙去匹配
- 这些变量的实例化有的来自module节点;有的来自于该变量的对象直接使用Inject修饰的构造函数:
-
(1)module节点一定是存在于component节点使用的componentAnnotation#modules及其下面关联的module节点,例如InjectBindingRegistry的实例化关联的是InjectBindingRegistryModule的injectBindingRegistry方法:
@Module public interface InjectBindingRegistryModule { @Binds InjectBindingRegistry injectBindingRegistry(InjectBindingRegistryImpl impl); }
-
@Inject修饰的InjectBindingRegistry生成的key钥匙匹配上@Binds修饰的injectBindingRegistry方法
-
(2)ValidationBindingGraphPlugins使用Inject修饰的构造函数:
@Inject ValidationBindingGraphPlugins( @Validation ImmutableSet<BindingGraphPlugin> plugins, DiagnosticReporterFactory diagnosticReporterFactory, XFiler filer, DaggerTypes types, DaggerElements elements, CompilerOptions compilerOptions, @ProcessingOptions Map<String, String> processingOptions) { this.plugins = plugins; this.diagnosticReporterFactory = diagnosticReporterFactory; this.filer = filer; this.types = types; this.elements = elements; this.compilerOptions = compilerOptions; this.processingOptions = processingOptions; }
-
@Inject修饰的ValidationBindingGraphPlugins生成的key钥匙匹配上使用ValidationBindingGraphPlugins类Inject修饰的构造函数;
- 那么@Binds修饰的injectBindingRegistry方法的依赖对象的key和ValidationBindingGraphPlugins类Inject修饰的构造函数的依赖对象的key又会去匹配,直到都得到满意的答复为止。
Resolved解析的意义在于此,让key钥匙匹配到对象,然后该对象的依赖的key又匹配,直到完成。
以上匹配的对象都会响应的收集,并且最终生成一个BindingGraph有向图