前言
github相关源码上有详细的注解,请自行对照github源码
简单解说下ProcessorComponent接口上module节点的作用:
-
InjectBindingRegistryModule:对ComponentProcessor类中injectBindingRegistry变量最终实例化成InjectBindingRegistryImpl对象;
-
SourceFileGeneratorsModule:为后面的代码生成提供实例化对象;
-
ProcessingStepsModule:本章核心内容,对不同注解的逻辑处理;
-
ProcessingEnvironmentModule:为提供XProcessingEnv可提供的参数:
- 例如DaggerElements的实例化需要
XConverters.toJavac(xProcessingEnv).getElementUtils()和XConverters.toJavac(xProcessingEnv).getTypeUtils()作为参数;
-
ComponentGeneratorModule:对component节点代码生成做单独处理;
-
BindingMethodValidatorsModule:收集bindingMethod绑定方法校验;
-
BindingGraphValidationModule: 绑定图形的校验;
以上主要目的都是为实例化提供需要的参数;
直接看ProcessingStepsModule接口中的processingSteps方法,该方法的参数表示针对不同注解的处理:规则校验,生成对象,校验对象,最终生成代码等操作。
注解规则
component节点规则
该节点校验在ComponentProcessingStep类的isComponentValid方法中,如果节点使用了Component、ProductionComponent、Subcomponent、ProductionSubcomponent注解修饰使用此规则校验。
在ComponentValidator类中validate方法作为校验入口,校验规则如下:
-
component节点上的componentAnnotation注解有且仅有一个;
-
如果component节点上使用了@CancellationPolicy注解修饰,那么当前component节点只能使用@ProductionSubcomponent或@ProductionComponent注解;
-
component节点只能是abstract抽象类或接口;
-
component节点最多只能存在一个creator节点,自行查看下面的creator的校验;
-
component节点不能使用@Reusable修饰;
-
如果component是一个kotlin文件,那么componentMethod方法名不能使用java关键字,自行查看下面componentMethod方法校验;
-
component节点中的入口(方法是abstract修饰或接口方法 && 方法无参 && 方法返回类型不是void && 方法没有使用泛型)并且该方法没有被重写,那么这个方法最多只能有一个;
-
本条根据代码翻译过来的,因为这个校验使用了EntryPoints,所以叫入口方法,但是个人理解下(1)这个绝对不是入口方法(ProcessorComponent接口中
void inject(ComponentProcessor processor)是货真价实的入口方法);(2)入口方法根据后面意思的理解也不是只存在一个; -
顺便理解下入口方法,入口方法是非private、非static修饰的abstract方法或接口方法,并且该方法的参数表示需要通过当前component节点进行实例化注入;
-
componentMethod方法返回类型是subcomponent或subcomponent.creator,该方法最多只能出现一个;
-
componentAnnotation#dependencies里面的类不能是module节点;
-
componentAnnotation#modules校验,自行查看;
-
还需要对当前componentMethod方法返回类型是subcomponent(或subcomponent.creator)的subcomponent节点进行校验,从步骤1开始。
componentMethod节点校验规则
这里仅仅针对abstract修饰(或接口方法)、非private、非static的(包括从父级类继承过来的)componentMethod方法做校验,规则如下:
-
componentMethod方法不能使用泛型,如果当前component节点是kotlin文件,那么注意componentMethod不能使用java关键字;
-
如果componentMethod方法的returnType返回类型是subcomponent节点,校验:
-
(1)当前componentMethod方法的参数必须是module节点,并且该方法只允许一次同一类型的module节点,并且这个module节点来源于(2)-subcomponent关联的module节点;
-
(2)收集subcomponent关联的module节点:①subcomponentAnnotation#modules里面的module节点;②条件①module节点上的注解moduleAnnotation#includes里面的module节点;③条件①和条件②的module节点的父级module(使用了moduleAnnotation注解)节点;
-
componentMethod方法返回类型是subcomponent.creator节点,当前方法参数必须为空,并且对creator节点校验,自行查看;
-
方法返回类型不是subcomponent节点也不是subcomponent.creator节点,那么参数最多只允许有一个,

本文深入解析Dagger2的ComponentProcessor中的注解规则,涵盖component、componentMethod、creator、module及bindingMethod等多个方面,详细阐述了各规则的校验逻辑,帮助理解Dagger2的组件构建过程。
最低0.47元/天 解锁文章
282

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



