简介
前面的某部分内容影响到后续的代码,所以把一些后面需要的内容在抽离复制一份到这里,这样后面的代码有些直接在这里查找即可。
当然不是万能的,该看的还是需要回头看。
Key对象
一个对象,包含①是否存在包裹,②是否使用了Qualifier注解的注解修饰。如果是依赖中的key对象则表示钥匙,用于匹配binding绑定的key对象
非常精辟的总结,自我感觉良好,看不懂去看代码会明白的!!!
DependencyRequest依赖对象
某一个对象A如果存在DependencyRequest依赖属性,表示当前对象A的实例化需要依赖于另一个对象B,那么另一个对象是谁?另一个对象B一定有一个Key属性,该Key对象被对象A的DependencyRequest依赖属性的Key属性匹配上了。
匹配即表示是同一个Key对象。还可以告诉你,对象A和另一个对象B表示的都是Binding绑定对象。
太精辟的解释,忍不住偷偷拿出小梳子。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MvpXD0L-1645066281091)(data:image/jpeg;base64,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)]
DependencyRequest依赖属性
-
RequestKind kind:根据传递的类型判断请求类型,自行查看RequestKind;
-
Key key:生成key对象
-
(1)qualifier,element请求节点是否使用了Qualifier注解修饰的注解修饰;
-
(2)type,将传递的类型剥离外壳作为type;
-
DaggerElement element:请求节点;
-
boolean isNullable:是否允许null,只要请求类型kind不是INSTANCE 或 element请求节点上使用了Nullable注解。
存在依赖的场景
- componentMethod方法生成DependencyRequest依赖对象条件:
-
规避条件:当前componentMethod方法如果没有使用Qualifier修饰的注解修饰 && 返回类型是subcomponent节点,那么不能生成当前DependencyRequest依赖。
-
(1)componentMethod方法无参生成DependencyRequest依赖:
-
① 如果当前componentMethod所在component节点是production类型,并且返回类型是ListenableFuture< T>,生成的DependencyRequest依赖:
-
a. kind属性:FUTURE,因为方法返回类型是ListenableFuture< T>;
-
b. key属性:qualifier属性- type属性-剥离ListenableFuture< T>得到T ,T作为type生成key对象;
-
c. element属性:componentMethod节点
-
② 当前componentMethod所在component节点不是production类型,或者是production类型但是返回类型不是ListenalbeFuture< T>,生成DependencyRequest依赖:
-
a. kind属性:componentMethod方法返回类型类型判断RequestKind类型;
-
b. key属性:qualifier属性-当前componentMethod使用的Qualifier修饰的注解情况,type属性-剥离RequestKind< T>得到T ,两个属性生成key对象;
-
c. element属性:componentMethod节点;
-
d. isNullable属性: kind !=RequestKind.INSTANCE || componentMethod方法上使用了Nullable注解 ,满足该条件表示true;
-
(2)componentMethod方法有且仅有一个参数生成DependencyRequest依赖:
-
① kind属性:MEMBERS_INJECTION;
-
② key属性:当前componentMethod方法唯一的parameter参数类型生成type作为key唯一属性;
-
③ element属性:当前方法节点;
- @Provudes或@Produces修饰的bindingMethod方法里面的**参数节点(作为请求节点)和参数类型(作为传递的类型)**生成DependencyRequest对象:
-
(1)kind属性:bindingMethod方法参数类型判断RequestKind类型;
-
(2)key属性:qualifier属性-当前bindingMethod方法上的参数使用的Qualifier修饰的注解,type属性-剥离RequestKind< T>得到T ,两个属性生成key对象;
-
(3)element属性:当前bindingMethod方法参数节点;
-
(4)isNullable属性: kind !=RequestKind.INSTANCE || bindingMethod方法参数节点使用了Nullable注解 ,满足该条件表示true;
- @Pruduces修饰的bindingMethod生成一个依赖作为executorRequest属性:
-
(1)kind属性:PROVIDER;
-
(2)key属性:①ProductionImplementation作为qualifier;②Executor作为type;
- @Pruduces修饰的bindingMethod生成一个依赖作为monitorRequest属性:
-
(1)kind属性:PROVIDER;
-
(2)key属性:ProductionComponentMonitorr作为type;
- @Binds修饰的BindingMethod方法利用**参数节点(作为请求节点)和参数类型(作为传递的类型)**生成DependencyRequest依赖:
-
(1)kind属性:bindingMethod方法参数类型判断RequestKind类型;
-
(2)key属性:qualifier属性-当前bindingMethod方法上的参数使用的Qualifier修饰的注解,type属性-剥离RequestKind< T>得到T ,两个属性生成key对象;
-
(3)element属性:当前bindingMethod方法参数节点;
-
(4)isNullable属性: kind !=RequestKind.INSTANCE || bindingMethod方法参数节点使用了Nullable注解 ,满足该条件表示true;
ComponentRequirement对象
这个东西坏得很,过程中使用到了,最后面的代码生成也是用到了,个人感觉非常欠收拾,导致我没办法非常好的给他一个明确的解释。
当然了,根据类型完全就可以知道是啥意思,但是干啥的我说不出所以然,这也是感觉需要整顿的原因。
ComponentRequirement属性
-
Kind kind:类型,DEPENDENCY,MODULE,BOUND_INSTANCE三种;
-
TypeElement typeElement:当前节点;
-
Optional<ComponentRequirement.NullPolicy> overrideNullPolicy:三种类型,NEW、THROW、ALLOW:
-
注:kind是DEPENDENCY和MODULE类型情况下为空;
-
(1)如果参数类型是frameworkType(Provider,Lazy,Producer,Produced或Prodiver<Lazy>)或者参数节点上使用了nullable注解,那么表示NullPolicy.ALLOW
- Optional key:
-
注:kind是DEPENDENCY和MODULE类型情况下为空;
-
(1)component.creator中的工厂模式(有且仅有)的factoryMethod方法中的@BindsInstance修饰的参数;或者构建者模式的setterMethod方法或方法参数使用@BindsInstance修饰的参数:
-
① qualifier:参数节点上是否使用了Qualifier注解修饰的注解修饰
-
② type:根据参数类型;(T,Provider,Lazy,Producer,Produced或Prodiver<Lazy>),剥离外壳仅仅使用T;
- String variableName:节点名称。
ComponentRequirement是用场景
- componentAnnotationAll#dependencies里面的dependency节点生成DEPENDENCY类型的componentRequirement对象;
-
(1)Kind kind:DEPENDENCY;
-
(2)TypeElement typeElement:dependency节点;
-
(3)String variableName:dependency节点名称;
- creator节点根据模式的不同针对setterMethod方法(Builder模式)和factoryMethod方法参数(FactoryMethod模式)分别生成componentRequirement对象:
-
注:以下说的方法表示factoryMethod方法或setterMethod方法,但是factoryMethod方法是不允许使用@BindsInstance修饰的;以下说的参数是factoryMethod方法参数或setterMethod方法参数;
-
(1)如果方法或方法参数使用了@BindsInstance修饰,那么当前方法或方法参数生成BOUND_INSTANCE类型的componentRequirement对象;
-
① Kind kind:BOUND_INSTANCE类型;
-
② TypeElement typeElement:方法parameter参数,剥离RequestKind< T>的T节点;
-
③ Optional<ComponentRequirement.NullPolicy> overrideNullPolicy:如果方法parameter参数上使用了@Nullable修饰 || parameter参数类型 != RequestKind.INSTANCE,那么当前属性值NullPolicy.ALLOW;否则为空;
-
④ Optional key:qualifier-方法parameter参数使用Qualifier修饰的注解修饰情况,type-方法parameter参数剥离RequestKind< T>类型的外壳获取T,生成的key对象;
-
⑤ String variableName:如果是setterMethod表示当前方法名称,如果是factoryMethod方法表示当前方法参数名;
-
(2)方法和方法参数都没有使用@BindsInstance修饰 && 方法parameter参数是module节点,那么生成MODULE类型的componentRequirement对象:
-
① Kind kind:MODULE;
-
② TypeElement typeElement:parameter参数节点;
-
③ String variableName:parameter参数节点名称;
-
(3)方法和方法参数都没有使用@BindsInstance修饰 && 方法parameter参数不是module节点,那么生成DEPENDENCY类型的componentRequirement对象:
-
① Kind kind:DEPENDENCY;
-
② TypeElement typeElement:parameter参数节点;
-
③ String variableName:parameter参数节点名称;
ComponentRequirement对象生成的要素:1.creator的@BindsInstance修饰方法生成BOUND_INSTANCE类型;2.creator节点中如果方法返回类型是subcomponent,那么该方法参数必定是module节点,该module节点生成MODULE类型对象;3.①如果creator方法不满足1和2,那么该方法生成DEPENDENCY类型对象;②componentAnnotation#dependencies里面的dependency生成DEPENDENCY类型对象;
RequestKind类型
泛型类型,每种类型表示一个T被不同类型对象包裹RequestKind< T>
-
INSTANCE类型: 使用T;没有使用任何类型对象包裹
-
PROVIDER类型:(1)Provider< T>类型对象;(2)Produces修饰的bindingMethod方法生成的ProductionBinding对象里面会生成两个属性:monitorRequest 和executorRequest,这两个依赖的kind类型都是PROVIDER类型;
-
LAZY类型:使用Lazy< T>;
-
PROVIDER_OF_LAZY类型:使用Provider<Lazy< T>>;
-
MEMBERS_INJECTION类型:componentMethod返回类型不是subcomponent,并且有且仅有一个参数,该方法生成的依赖RequestKind类型;
-
PRODUCER类型:使用Producer< T>;
-
PRODUCED类型:使用Produced< T>;
-
FUTURE类型:使用ListenableFuture< T>,只有在componentMethod方法所在component节点是production类型才可以使用该ListenableFuture< T>返回类型;
BindingKind绑定类型
表示生成的绑定对象表示的类型:
-
INJECTION:(未校验)Inject修饰的构造函数生成的ProvisionBinding
-
PROVISION:使用@Provides修饰的bindingMethod方法生成的绑定对象类型;
-
ASSISTED_INJECTION:(未校验)AssistedInject修饰的构造函数生成的ProvisionBinding
-
ASSISTED_FACTORY:(未校验)表示使用AssistedFactory修饰;
-
COMPONENT:(未校验)表示使用Component或ProductionComponent修饰的component节点生成一个ProvisionBinding绑定对象;
-
COMPONENT_PROVISION:(未校验)Component#dependencies里面的类的无参返回类型不是void的方法生成的ProvisionBinding;
-
COMPONENT_DEPENDENCY:(未校验)componentAnnotation#dependencies()里面的dependency节点生成ProvisionBinding绑定对象;
-
MEMBERS_INJECTOR:(未校验)componentMethod返回类型或componentMethod唯一参数类型关联的Inject修饰的变量或方法 的方法参数是MembersInjector类型生成的绑定;
-
SUBCOMPONENT_CREATOR:(未校验)
-
(1) component中的方法返回类型是一个subcomponent.Builder(表示的是一个Builder), 那么使用当前方法和该方法所在的component类生成一个ProvisionBinding对象;
-
(2)component关联的module注解中的subcomponent生成的SubcomponentDeclaration对象如果能匹配上requestKey(requestKey:componentMethod返回类型 或 componentMethod唯一参数 使用Inject修饰的变量或方法的方法参数作为type生成的key),那么该key生成的绑定对象类型;
-
BOUND_INSTANCE:(未校验)BindsInstance修饰的方法(或方法参数),该方法或方法参数作为bindingElement,该方法的参数根据RequestKind剥离外壳作为type生成key——生成ProvisionBinding对象;
-
PRODUCTION:bindingMethod如果使用了@Produces修饰生成的绑定对象类型;
-
COMPONENT_PRODUCTION:(未校验)ProductionComponent#dependencies里面的节点的无参返回类型不是void的方法生成ProductionBinding;
-
MULTIBOUND_SET:(未校验)返回类型是Set,该绑定会同时依赖Provides或Produces
-
MULTIBOUND_MAP:(未校验)返回类型是Map<K,V>,该绑定会同时依赖Provides或Produces
-
OPTIONAL:(未校验)component的componentMethod方法返回类型 或componentMethod唯一参数里面的Inject修饰的变量或方法参数表示的requestKey, 如果存在Optional,该T生成的key能够匹配上 (component节点关联的module关联的BindsOptionalOf修饰的bindingMethod方法生成)的OptionalBindingDeclaration对象,该requestKey生成的ContributionBinding绑定对象类型;
-
DELEGATE:(未校验)使用Binds修饰的bindingMethod方法生成的绑定对象;
-
MEMBERS_INJECTION:(未校验)生成的MembersInjectionBinding对象。
BindingType
-
PROVISION:ProvisionBinding对象bindingType属性;
-
MEMBERS_INJECTION:MembersInjectionBinding对象bindingType属性;
-
PRODUCTION:ProductionBinding对象bindingType属性。
哪些条件下生成ProvisionBinding
- Provides修饰的bindingMethod;
哪些条件下生成ProductionBinding对象
- Produces修饰的bindingMethod方法;
总结
以上总结性对象都非常非常的重要,后面涉及到相关信息直接在这里查找即可。