简介
前面的某部分内容影响到后续的代码,所以把一些后面需要的内容在抽离复制一份到这里,这样后面的代码有些直接在这里查找即可。
当然不是万能的,该看的还是需要回头看。
Key对象
一个对象,包含①是否存在包裹,②是否使用了Qualifier注解的注解修饰。如果是依赖中的key对象则表示钥匙,用于匹配binding绑定的key对象
非常精辟的总结,自我感觉良好,看不懂去看代码会明白的!!!
key及其变异
什么是变异钥匙,如下解释:
- Key本身;
- 如果Key type类型是Set<Produced>返回Set作为type;
- 如果Key type类型是Map<K, Producer>返回Map<K, Producer>
- 如果Key type类型是Map<K, Provider>返回Map<K, Producer>
- 如果Key type类型是 Map<K, V> 或 Map<K, Produced>改成Map<K, Provider> 和 {@code Map<K, Producer>;
BindingType
-
PROVISION:ProvisionBinding对象bindingType属性;
-
MEMBERS_INJECTION:MembersInjectionBinding对象bindingType属性;
-
PRODUCTION:ProductionBinding对象bindingType属性。
RequestKind类型
泛型类型,每种类型表示一个T被不同类型对象包裹RequestKind< T>
-
INSTANCE类型: (1)使用T;没有使用任何类型对象包裹;(2)@Provides或@Produces或@Binds修饰的bindingMethod使用@IntoSet或@ElementIntoSet生成的依赖的kind属性;
-
PROVIDER类型:(1)Provider< T>类型对象;(2)Produces修饰的bindingMethod方法生成的ProductionBinding对象里面会生成两个属性:monitorRequest 和executorRequest,这两个依赖的kind类型都是PROVIDER类型;(3)如果key的type使用了AssistedFactory修饰,该type生成ProvisionBinding对象的provisionDependencies依赖的kind属性;
-
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的BindingKind kind属性;
-
PROVISION:使用@Provides修饰的bindingMethod方法生成的ProvisionBinding的BindingKind kind属性;
-
ASSISTED_INJECTION:AssistedInject修饰的构造函数生成的ProvisionBinding的BindingKind kind属性
-
ASSISTED_FACTORY:key的type使用了AssistedFactory修饰生成的ProvisionBinding的BindingKind kind属性;
-
COMPONENT:component节点生成一个ProvisionBinding绑定对象的BindingKind kind属性;
-
COMPONENT_PROVISION:component节点不是production的componentAnnotation#dependencies里面的类的无参返回类型不是void的方法生成的ProvisionBinding的BindingKind kind属性;
-
COMPONENT_DEPENDENCY:componentAnnotation#dependencies()里面的dependency节点生成ProvisionBinding绑定对象的BindingKind kind属性;
-
MEMBERS_INJECTOR:key对象的type类型如果是MembersInjector< T>,并且type作为当前key唯一参数;该key所生成的ProvisionBinding对象的BindingKind kind属性;
-
SUBCOMPONENT_CREATOR:
-
(1) component中的方法返回类型是一个subcomponent.Builder(表示的是一个Builder),并且该subcomponent不在component关联的subcomponents集合中, 那么使用当前方法和该方法所在的component类生成一个ProvisionBinding对象;
-
(2)key及其变异匹配上component关联的module类的注解moduleAnnotation#subcomponents()里面的类生成的SubcomponentDeclaration,生成ProvisionBinding对象;
-
BOUND_INSTANCE:creator节点中使用BindsInstance修饰的方法(或方法参数),该方法或方法参数作为bindingElement,该方法的参数根据RequestKind剥离外壳作为type生成key——生成ProvisionBinding对象的BindingKind kind属性;
-
PRODUCTION:bindingMethod如果使用了@Produces修饰生成的绑定对象类型;
-
COMPONENT_PRODUCTION:component节点是production的componentAnnotation#dependencies里面的节点的无参返回类型不是void的方法生成ProductionBinding的BindingKind kind属性;
-
MULTIBOUND_SET:如果key及其变异匹配上 (1)@Provides或@Produces或@Binds修饰的bindingMethod,该bindingMethod还是用了@IntoMap或@IntoSet或@ElementsIntoSet、(2)@Multibinds修饰的bindingMethod方法,该key的type是Set< T>,那么生成的Binding对象的BindingKind属性;
-
MULTIBOUND_MAP:如果key及其变异匹配上 (1)@Provides或@Produces或@Binds修饰的bindingMethod,该bindingMethod还是用了@IntoMap或@IntoSet或@ElementsIntoSet、(2)@Multibinds修饰的bindingMethod方法,该key的type是Map<K,V>,那么生成的Binding对象的BindingKind属性;
-
OPTIONAL:key及其变异的type类型是Optional< T>,那么把type改成T生成新的newkey如果匹配到@BindsOptionalOf修饰的bindingMethod的BindingKind kind属性;
-
DELEGATE:被key匹配上的使用Binds修饰的bindingMethod方法生成的绑定对象的BindingKind kind属性;
-
MEMBERS_INJECTION:生成的MembersInjectionBinding对象的BindingKind kind属性。
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使用场景
- componentAnnotation#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类型对象;
哪些条件下生成ProvisionBinding对象
-
Provides修饰的bindingMethod生成ProvisionBinding对象-属性对照关系图
-
Inject或AssistedInject修饰构造函数生成ProvisionBinding对象 - 属性对照关系图
-
component节点生成ProvisionBinding对象 - 属性如下:
- ① contributionType(ContributionType.UNIQUE);
- ② bindingElement(component节点);
- ③ Key key: component节点作为type生成的key对象;
- ④ kind(COMPONENT);
- componentAnnotation#dependencies()里面的dependency节点生成ProvisionBinding绑定对象,属性如下:
- ① contributionType(ContributionType.UNIQUE);
- ② bindingElement(dependency节点);
- ③ Key key:dependency节点作为type生成的key对象;
- ④ kind(COMPONENT_DEPENDENCY);
- 如果component不是production类型,componentAnnotation#dependencies中的dependency节点中无参 && 返回类型不是void的方法生成ProvisionBinding绑定对象,属性如下:
- ① contributionType(ContributionType.UNIQUE);
- ② bindingElement(dependency当前无参返回类型不是void的方法节点);
- ③ Key key:①qualifier,当前方法Qualifier修饰的注解修饰情况;②type:a.当前返回类型如果是ListenableFuture或
FluentFuture将T作为type;b.直接使用方法返回类型作为type; - ④ kind(ProductionBinding对象是COMPONENT_PRODUCTION 或 ProvisionBinding对象的COMPONENT_PROVISION);
- ⑤scope:针对ProvisionBinding,当前Scope注解修饰的注解修饰当前方法情况;
- ⑥thrownTypes:针对ProductionBinding,当前方法异常抛出情况;
- creator节点中使用BindsInstance修饰的方法(或方法参数),该方法或方法参数作为bindingElement,该方法的参数根据RequestKind剥离外壳作为type生成key——生成ProvisionBinding对象,属性如下:
- ① contributionType(ContributionType.UNIQUE);
- ② bindingElement(@BindsInstance修饰过(或方法参数所在)的方法节点);
- ③ Key key:方法上的参数类型(根据RequestKind剥离外壳)作为type生成的key;
- ④ kind(BOUND_INSTANCE);
- 当前component中的方法的返回类型是一个subcomponent.creator(其实Builder模式),并且该subcomponent不在
componentAnnotation#modules以及关联的moduleAnnotation#subcomponents的集合中,生成ProvisionBinding对象属性:
- ① contributionType(ContributionType.UNIQUE);
- ② bindingElement(childcomponent节点返回类型是subcomponent.builder的方法节点);
- ③ Key key:当前方法返回类型作为type;
- ④ kind(SUBCOMPONENT_CREATOR);
以下都是被key匹配上生成的Binding绑定对象:
- 被key钥匙匹配上的@Binds修饰的bindingMethod方法生成的DelegateDeclaration对象转换成ContributionBinding对象,如果当前DelegateDeclaration对象的依赖的key钥匙匹配上的是ProvisionBinding对象我们这里给起个名字叫P1,那么当前DelegateDeclaration对象转换成ProvisionBinding对象,属性如下:
- ① scope:@Binds修饰的bindingMethod使用scrop修饰情况;
- ② nullableType:P1对象的nullableType属性;
- ③ contributionType:@Binds修饰的bindingMethod使用的ContributionType属性;
- ④ bindingElement:@Binds修饰的bindingMethod节点;
- ⑤ contributingModule:@Binds修饰的bindingMethod节点所在的module节点;
- ⑥ isContributingModuleKotlinObject:@Binds修饰的bindingMethod节点所在的module节点是否kotlin文件;
- ⑦ Key key:(1)当前@Binds修饰的bindingMethod节点没有使用IntoMap,直接使用DelegateDeclaration对象的key;(2)如果使用了IntoMap,原先的type是Map<K, V>,改成Map<K, Provider>作为type属性生成新的key对象;
- ⑧ dependencies:沿用DelegateDeclaration对象的依赖;
- ⑨ wrappedMapKeyAnnotation:沿用DelegateDeclaration对象的MapKey注解使用情况;
- ⑩ kind(DELEGATE);
2.(1)@Provides或@Produces或@Binds修饰的bindingMethod,该bindingMethod还使用了@IntoMap或@IntoSet或@ElementsIntoSet、(2)@Multibinds修饰的bindingMethod方法。如果被**key及其变异(自行查看上面)**匹配上(1)或(2),那么 ①如果key的type是Map<K,X>,这个X不是Producer< T>也不是Produced< T>,②如果key的type是Set< X>,X不是 Produced< T>,③又或者匹配上的那个@Binds修饰的bindingMethod生成的DelegateDeclaration转换的是ProvisionBinding,①②③依次判断,生成的ProvisionBinding对象属性如下:
- ① contributionType(ContributionType.UNIQUE);
- ② dependencies:(1)条件必须满足,否则不存在依赖;
- ③ Key key:当前的key钥匙;
- ④ kind:key钥匙是Set< T>,表示BindingKind.MULTIBOUND_SET;key钥匙是Map<K,V>,使用BindingKind.MULTIBOUND_MAP;
- 如果key及其变异的type类型是Optional< T>,那么把type改成T生成新的newkey如果匹配到@BindsOptionalOf修饰的bindingMethod,存在以下情况;
-
(1)并且newkey如果没有匹配到了Binding绑定对象,那么生成ProvisionBinding对象,属性如下:
-
①contributionType(ContributionType.UNIQUE);
-
②key(key钥匙);
-
③kind(OPTIONAL);
-
(2)如果newKey钥匙匹配到了Binding绑定对象,但是匹配上的该Binding绑定对象不是ProductionBinding && newKey的type没有使用Producer< T>类型也没用使用Produced< T>类型,生成ProvisionBinding对象,属性如下:
-
①contributionType(ContributionType.UNIQUE);
-
②key(key钥匙);
-
③kind(OPTIONAL);
-
④dependencies:自行查看依赖;
- key及其变异匹配上component关联的module类的注解moduleAnnotation#subcomponents()里面的类生成的SubcomponentDeclaration,生成ProvisionBinding对象,属性如下:
- ①contributionType(ContributionType.UNIQUE)
- ②key(subcomponentDeclaration.key())其实是当前subcomponent.creator节点
- ③kind(SUBCOMPONENT_CREATOR);
- 如果key要是的type类型是MembersInjector< T>,type作为key唯一属性,对T作为type生成新的newKey钥匙,newKey生成MembersInjectionBinding对象存储于InjectRegistryImpl,并且key钥匙和MembersInjectionBinding对象生成新的ProvisionBinding对象,属性如下:
- (1)key(key)
- (2)contributionType(ContributionType.UNIQUE)
- (3)kind(MEMBERS_INJECTOR)
- (4)bindingElement(newkey的type)
- (5)provisionDependencies(membersInjectionBinding.dependencies()):newKey的type使用Inject修饰的变量或普通方法生成的依赖,自行查看依赖;
- (6)injectionSites(membersInjectionBinding.injectionSites()):newKey的type使用Inject修饰的变量或普通方法
- 如果key的type使用了AssistedFactory修饰,该type生成ProvisionBinding对象,属性如下,
-
(1)contributionType(ContributionType.UNIQUE)
-
(2)key(type作为key为属性)
-
(3)bindingElement(type节点)
-
(4)provisionDependencies(依赖,还是privisionDependencies依赖,自行查看依赖)
-
(5)kind(ASSISTED_FACTORY);
- 如果key钥匙匹配过程中一个都没有匹配到,那么当前key的type是否使用了AssistedInject或Inject的构造函数集合,如果是,则对该构造函数生成ProvisionBinding对象
- 注:这个和2是完全一致的,只是这里解释了为什么key会匹配到AssistedInject或Inject的构造函数。
哪些条件下生成ProductionBinding对象
-
Produces修饰的bindingMethod方法生成ProductionBinding对象;
-
如果component是production类型,componentAnnotation#dependencies中的dependency节点中无参 && 返回类型不是void的方法生成ProductionBinding绑定对象,属性如下:
- ① contributionType(ContributionType.UNIQUE);
- ② bindingElement(dependency当前无参返回类型不是void的方法节点);
- ③ Key key:①qualifier,当前方法Qualifier修饰的注解修饰情况;②type:a.当前返回类型如果是ListenableFuture或
FluentFuture将T作为type;b.直接使用方法返回类型作为type; - ④ kind(ProductionBinding对象是COMPONENT_PRODUCTION 或 ProvisionBinding对象的COMPONENT_PROVISION);
- ⑤scope:针对ProvisionBinding,当前Scope注解修饰的注解修饰当前方法情况;
以下都是被key匹配上生成的Binding绑定对象:
- 被key钥匙匹配上的@Binds修饰的bindingMethod方法生成的DelegateDeclaration对象转换成ContributionBinding对象,如果当前DelegateDeclaration对象的依赖的key钥匙匹配上的是ProductionBinding对象我们这里给起个名字叫P2,那么当前DelegateDeclaration对象转换成ProductionBinding对象,属性如下:
- ① scope:没有此属性;
- ② nullableType:P1对象的nullableType属性;
- ③ contributionType:@Binds修饰的bindingMethod使用的ContributionType属性;
- ④ bindingElement:@Binds修饰的bindingMethod节点;
- ⑤ contributingModule:@Binds修饰的bindingMethod节点所在的module节点;
- ⑥ isContributingModuleKotlinObject:@Binds修饰的bindingMethod节点所在的module节点是否kotlin文件;
- ⑦ Key key:(1)当前@Binds修饰的bindingMethod节点没有使用IntoMap,直接使用DelegateDeclaration对象的key;(2)如果使用了IntoMap,原先的type是Map<K, V>,改成Map<K, Producer< V>>作为type属性生成新的key对象;
- ⑧ dependencies:沿用DelegateDeclaration对象的依赖;
- ⑨ wrappedMapKeyAnnotation:沿用DelegateDeclaration对象的MapKey注解使用情况;
- ⑩ kind(DELEGATE);
- (1)@Provides或@Produces或@Binds修饰的bindingMethod,该bindingMethod还使用了@IntoMap或@IntoSet或@ElementsIntoSet、(2)@Multibinds修饰的bindingMethod方法 。如果被key及其变异匹配上(1)或(2),那么 ①如果key的type是Map<K,X>,这个X是Producer< T>或是Produced< T>不做②③判断,②如果key的type是Set< X>,X是 Produced< T>不做③判断,③又或者匹配上的那个@Binds修饰的bindingMethod生成的DelegateDeclaration转换的是ProductionBinding,生成的ProductionBinding对象属性如下:
- ① contributionType(ContributionType.UNIQUE);
- ② dependencies:(1)条件必须满足,否则不存在依赖;
- ③ Key key:当前的key钥匙;
- ④ kind:key钥匙是Set< T>,表示BindingKind.MULTIBOUND_SET;key钥匙是Map<K,V>,使用BindingKind.MULTIBOUND_MAP;
- 如果key及其变异的type类型是Optional< T>,那么把type改成T生成新的newkey如果匹配到@BindsOptionalOf修饰的bindingMethod,,如果newKey钥匙匹配到了Binding绑定对象,匹配上的该Binding绑定对象是ProductionBinding || newKey的type使用Producer< T>类型或使用Produced< T>类型,生成的ProductionBinding对象,属性如下:
- ①contributionType(ContributionType.UNIQUE);
- ②key(key钥匙);
- ③kind(OPTIONAL);
- ④dependencies:自行查看依赖;
MembersInjectionBinding对象
该MembersInjectionBinding对象的key的type(一个类A)需要通过DI(依赖注入)注入该MembersInjectionBinding对象的dependencies依赖的key的type(类A使用Inject修饰的变量或普通方法),目前场景:
-
componentMethod方法无参并且返回类型是MembersInjector,T生成MembersInjectionBinding;
-
componentMethod返回类型既不是subcomponent又不是subcomponent.creator,有且仅有一个参数,当前参数生成MembersInjectionBinding;
-
module节点中的被@Produces或@Provides或@Binds修饰的bindingMethod方法中的参数(其中@Binds修饰的方法有且仅有一个参数)类型是MembersInjector,T生成MembersInjectionBinding;
-
Inject或AssistedInject修饰的构造函数的参数如果使用了MembersInjector,T生成MembersInjectionBinding;
-
Inject修饰的变量如果使用了MembersInjector,T生成MembersInjectionBinding;
-
Inject修饰的普通方法参数如果使用了MembersInjector,T生成MembersInjectionBinding。
DependencyRequest依赖对象
某一个对象A如果存在DependencyRequest依赖属性,表示当前对象A的实例化需要依赖于另一个对象B,那么另一个对象是谁?另一个对象B一定有一个Key属性,该Key对象被对象A的DependencyRequest依赖属性的Key属性匹配上了。
匹配即表示是同一个Key对象。还可以告诉你,对象A和另一个对象B表示的都是Binding绑定对象。
太精辟的解释,忍不住偷偷拿出小梳子。
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;
- Inject或AssistedInject修饰的构造函数里面的(没有使用@Assisted修饰)参数作为依赖,**参数节点(作为请求节点)和参数类型(作为传递的类型)**生成DependencyRequest:
-
(1)kind属性:Inject或AssistedInject修饰的构造函数的参数类型判断RequestKind类型;
-
(2)key属性:qualifier属性-当前Inject或AssistedInject修饰的构造函数上的参数使用的Qualifier修饰的注解,type属性-剥离RequestKind< T>得到T ,两个属性生成key对象;
-
(3)element属性:当前构造函数方法参数节点;
-
(4)isNullable属性: kind !=RequestKind.INSTANCE || Inject或AssistedInject修饰的构造函数参数节点使用了Nullable注解 ,满足该条件表示true;
- Inject修饰的变量(变量节点和变量节点类型)和Inject修饰的普通方法(方法参数节点和参数节点类型)生成依赖:
-
(1)kind属性:Inject修饰的节点类型判断RequestKind类型;
-
(2)key属性:qualifier属性-当前Inject修饰的节点使用的Qualifier修饰的注解,type属性-节点类型剥离RequestKind< T>得到T ,两个属性生成key对象;
-
(3)element属性:当前Inject修饰的节点;
-
(4)isNullable属性: kind !=RequestKind.INSTANCE || Inject修饰的节点使用了Nullable注解 ,满足该条件表示true;
以下表示key匹配上后会在Binding对象上生成的依赖:
- (1)@Provides或@Produces或@Binds修饰的bindingMethod,该bindingMethod还是用了@IntoMap或@IntoSet或@ElementsIntoSet、(2)@Multibinds修饰的bindingMethod方法 ,如果被**key及其变异(下面自查)**匹配上(1)或(2),该key钥匙和@Provides或@Produces或@Binds修饰的bindingMethod生成的Binding对象生成依赖,属性如下:
-
注如果(1)不存在,那么就不存在下面的依赖,也就是说只有当key匹配上了@Provides或@Produces或@Binds修饰的bindingMethod才会有依赖
-
kind属性:①如果@Provides或@Produces或@Binds修饰的bindingMethod使用@IntoSet或@ElementIntoSet那么使用 INSTANCE;②如果使用了@IntoMap修饰,那么根据Map<K,X>,X使用的Provider或Producer决定是PROVIDER还是PRODUCER;
-
key属性:@Provides或@Produces或@Binds修饰的bindingMethod生成的Binding对象的key属性;
- 如果key及其变异的type类型是Optional< T>,那么把type改成T生成新的newkey如果匹配到@BindsOptionalOf修饰的bindingMethod,并且如果newKey钥匙匹配到了Binding绑定对象,依赖属性如下:
- (1)kind:newKey使用的RequestKind框架属性;
- (2)key:newKey;
- (3)isNullable:kind!=INSTANCE;
-
如果key要是的type类型是MembersInjector< T>,type作为key唯一属性,对T作为type生成新的newKey钥匙,newKey生成MembersInjectionBinding对象存储于InjectRegistryImpl,并且key钥匙和MembersInjectionBinding对象生成新的ProvisionBinding对象的依赖,两个依赖,一个是MembersInjectionBinding的依赖还有一个是ProvisionBinding对象的依赖,两个依赖完全一样;
-
如果key的type使用了AssistedFactory修饰,该type生成ProvisionBinding对象的provisionDependencies依赖,属性如下:
- (1)key(@AssistedFactory修饰的类或接口中的唯一的absract修饰的方法或接口方法的返回类型作为type生成的key,type作为当前key唯一属性);
- (2)kind(RequestKind.PROVIDER);
总结
以上总结性对象都非常非常的重要,后面涉及到相关信息直接在这里查找即可。
关系图地址,拖进https://www.iodraw.com/diagram/即可查看。
可在QQ群:575306647 讨论
kind、type贼多,理解起来感觉扯到了蛋~疼!!!