前言
这部分对前面的依赖非常大,这一部分的精华是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又会去匹配,直到都得到满意的答复为止。

本文详细解析了Dagger2中的Resolved解析器,从component入口方法开始,探讨了Resolved如何进行依赖匹配和对象实例化,涉及Resolved属性赋值、Resolved解析过程,以及ResolvedBindings对象的收集和匹配逻辑。文章强调了Resolved解析的重要性,并指出其在依赖注入中的关键作用。
最低0.47元/天 解锁文章
309

被折叠的 条评论
为什么被折叠?



