0.Dagger2.38.1源码解析-多种类型查询总结

简介

前面的某部分内容影响到后续的代码,所以把一些后面需要的内容在抽离复制一份到这里,这样后面的代码有些直接在这里查找即可。

当然不是万能的,该看的还是需要回头看。

Key对象

一个对象,包含①是否存在包裹,②是否使用了Qualifier注解的注解修饰。如果是依赖中的key对象则表示钥匙,用于匹配binding绑定的key对象

非常精辟的总结,自我感觉良好,看不懂去看代码会明白的!!!

key及其变异

什么是变异钥匙,如下解释:

  1. Key本身;
  2. 如果Key type类型是Set<Produced>返回Set作为type;
  3. 如果Key type类型是Map<K, Producer>返回Map<K, Producer>
  4. 如果Key type类型是Map<K, Provider>返回Map<K, Producer>
  5. 如果Key type类型是 Map<K, V> 或 Map<K, Produced>改成Map<K, Provider> 和 {@code Map<K, Producer>;

BindingType

  1. PROVISION:ProvisionBinding对象bindingType属性;

  2. MEMBERS_INJECTION:MembersInjectionBinding对象bindingType属性;

  3. PRODUCTION:ProductionBinding对象bindingType属性。

RequestKind类型

泛型类型,每种类型表示一个T被不同类型对象包裹RequestKind< T>

  1. INSTANCE类型: (1)使用T;没有使用任何类型对象包裹;(2)@Provides或@Produces或@Binds修饰的bindingMethod使用@IntoSet或@ElementIntoSet生成的依赖的kind属性;

  2. PROVIDER类型:(1)Provider< T>类型对象;(2)Produces修饰的bindingMethod方法生成的ProductionBinding对象里面会生成两个属性:monitorRequest 和executorRequest,这两个依赖的kind类型都是PROVIDER类型;(3)如果key的type使用了AssistedFactory修饰,该type生成ProvisionBinding对象的provisionDependencies依赖的kind属性;

  3. LAZY类型:使用Lazy< T>;

  4. PROVIDER_OF_LAZY类型:使用Provider<Lazy< T>>;

  5. MEMBERS_INJECTION类型:componentMethod返回类型不是subcomponent,并且有且仅有一个参数,该方法生成的依赖RequestKind类型;

  6. PRODUCER类型:使用Producer< T>;

  7. PRODUCED类型:使用Produced< T>;

  8. FUTURE类型:使用ListenableFuture< T>,只有在componentMethod方法所在component节点是production类型才可以使用该ListenableFuture< T>返回类型;

BindingKind绑定类型

表示生成的绑定对象表示的类型:

  1. INJECTION:Inject修饰的构造函数生成的ProvisionBinding的BindingKind kind属性;

  2. PROVISION:使用@Provides修饰的bindingMethod方法生成的ProvisionBinding的BindingKind kind属性;

  3. ASSISTED_INJECTION:AssistedInject修饰的构造函数生成的ProvisionBinding的BindingKind kind属性

  4. ASSISTED_FACTORY:key的type使用了AssistedFactory修饰生成的ProvisionBinding的BindingKind kind属性;

  5. COMPONENT:component节点生成一个ProvisionBinding绑定对象的BindingKind kind属性;

  6. COMPONENT_PROVISION:component节点不是production的componentAnnotation#dependencies里面的类的无参返回类型不是void的方法生成的ProvisionBinding的BindingKind kind属性;

  7. COMPONENT_DEPENDENCY:componentAnnotation#dependencies()里面的dependency节点生成ProvisionBinding绑定对象的BindingKind kind属性;

  8. MEMBERS_INJECTOR:key对象的type类型如果是MembersInjector< T>,并且type作为当前key唯一参数;该key所生成的ProvisionBinding对象的BindingKind kind属性;

  9. SUBCOMPONENT_CREATOR:

  • (1) component中的方法返回类型是一个subcomponent.Builder(表示的是一个Builder),并且该subcomponent不在component关联的subcomponents集合中, 那么使用当前方法和该方法所在的component类生成一个ProvisionBinding对象;

  • (2)key及其变异匹配上component关联的module类的注解moduleAnnotation#subcomponents()里面的类生成的SubcomponentDeclaration,生成ProvisionBinding对象;

  1. BOUND_INSTANCE:creator节点中使用BindsInstance修饰的方法(或方法参数),该方法或方法参数作为bindingElement,该方法的参数根据RequestKind剥离外壳作为type生成key——生成ProvisionBinding对象的BindingKind kind属性;

  2. PRODUCTION:bindingMethod如果使用了@Produces修饰生成的绑定对象类型;

  3. COMPONENT_PRODUCTION:component节点是production的componentAnnotation#dependencies里面的节点的无参返回类型不是void的方法生成ProductionBinding的BindingKind kind属性;

  4. MULTIBOUND_SET:如果key及其变异匹配上 (1)@Provides或@Produces或@Binds修饰的bindingMethod,该bindingMethod还是用了@IntoMap或@IntoSet或@ElementsIntoSet、(2)@Multibinds修饰的bindingMethod方法,该key的type是Set< T>,那么生成的Binding对象的BindingKind属性;

  5. MULTIBOUND_MAP:如果key及其变异匹配上 (1)@Provides或@Produces或@Binds修饰的bindingMethod,该bindingMethod还是用了@IntoMap或@IntoSet或@ElementsIntoSet、(2)@Multibinds修饰的bindingMethod方法,该key的type是Map<K,V>,那么生成的Binding对象的BindingKind属性;

  6. OPTIONAL:key及其变异的type类型是Optional< T>,那么把type改成T生成新的newkey如果匹配到@BindsOptionalOf修饰的bindingMethod的BindingKind kind属性;

  7. DELEGATE:被key匹配上的使用Binds修饰的bindingMethod方法生成的绑定对象的BindingKind kind属性;

  8. MEMBERS_INJECTION:生成的MembersInjectionBinding对象的BindingKind kind属性。

ComponentRequirement对象

这个东西坏得很,过程中使用到了,最后面的代码生成也是用到了,个人感觉非常欠收拾,导致我没办法非常好的给他一个明确的解释。

当然了,根据类型完全就可以知道是啥意思,但是干啥的我说不出所以然,这也是感觉需要整顿的原因。

ComponentRequirement属性

  1. Kind kind:类型,DEPENDENCY,MODULE,BOUND_INSTANCE三种;

  2. TypeElement typeElement:当前节点;

  3. Optional<ComponentRequirement.NullPolicy> overrideNullPolicy:三种类型,NEW、THROW、ALLOW:

  • 注:kind是DEPENDENCY和MODULE类型情况下为空;

  • (1)如果参数类型是frameworkType(Provider,Lazy,Producer,Produced或Prodiver<Lazy>)或者参数节点上使用了nullable注解,那么表示NullPolicy.ALLOW

  1. Optional key:
  • 注:kind是DEPENDENCY和MODULE类型情况下为空;

  • (1)component.creator中的工厂模式(有且仅有)的factoryMethod方法中的@BindsInstance修饰的参数;或者构建者模式的setterMethod方法或方法参数使用@BindsInstance修饰的参数:

  • ① qualifier:参数节点上是否使用了Qualifier注解修饰的注解修饰

  • ② type:根据参数类型;(T,Provider,Lazy,Producer,Produced或Prodiver<Lazy>),剥离外壳仅仅使用T;

  1. String variableName:节点名称。

ComponentRequirement使用场景

  1. componentAnnotation#dependencies里面的dependency节点生成DEPENDENCY类型的componentRequirement对象;
  • (1)Kind kind:DEPENDENCY;

  • (2)TypeElement typeElement:dependency节点;

  • (3)String variableName:dependency节点名称;

  1. 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对象

  1. Provides修饰的bindingMethod生成ProvisionBinding对象-属性对照关系图

  2. Inject或AssistedInject修饰构造函数生成ProvisionBinding对象 - 属性对照关系图

  3. component节点生成ProvisionBinding对象 - 属性如下:

  • ① contributionType(ContributionType.UNIQUE);
  • ② bindingElement(component节点);
  • ③ Key key: component节点作为type生成的key对象;
  • ④ kind(COMPONENT);
  1. componentAnnotation#dependencies()里面的dependency节点生成ProvisionBinding绑定对象,属性如下:
  • ① contributionType(ContributionType.UNIQUE);
  • ② bindingElement(dependency节点);
  • ③ Key key:dependency节点作为type生成的key对象;
  • ④ kind(COMPONENT_DEPENDENCY);
  1. 如果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,当前方法异常抛出情况;
  1. creator节点中使用BindsInstance修饰的方法(或方法参数),该方法或方法参数作为bindingElement,该方法的参数根据RequestKind剥离外壳作为type生成key——生成ProvisionBinding对象,属性如下:
  • ① contributionType(ContributionType.UNIQUE);
  • ② bindingElement(@BindsInstance修饰过(或方法参数所在)的方法节点);
  • ③ Key key:方法上的参数类型(根据RequestKind剥离外壳)作为type生成的key;
  • ④ kind(BOUND_INSTANCE);
  1. 当前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绑定对象:

  1. 被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;
  1. 如果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:自行查看依赖;

  1. key及其变异匹配上component关联的module类的注解moduleAnnotation#subcomponents()里面的类生成的SubcomponentDeclaration,生成ProvisionBinding对象,属性如下:
  • ①contributionType(ContributionType.UNIQUE)
  • ②key(subcomponentDeclaration.key())其实是当前subcomponent.creator节点
  • ③kind(SUBCOMPONENT_CREATOR);
  1. 如果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修饰的变量或普通方法
  1. 如果key的type使用了AssistedFactory修饰,该type生成ProvisionBinding对象,属性如下,
  • (1)contributionType(ContributionType.UNIQUE)

  • (2)key(type作为key为属性)

  • (3)bindingElement(type节点)

  • (4)provisionDependencies(依赖,还是privisionDependencies依赖,自行查看依赖)

  • (5)kind(ASSISTED_FACTORY);

  1. 如果key钥匙匹配过程中一个都没有匹配到,那么当前key的type是否使用了AssistedInject或Inject的构造函数集合,如果是,则对该构造函数生成ProvisionBinding对象
  • 注:这个和2是完全一致的,只是这里解释了为什么key会匹配到AssistedInject或Inject的构造函数。

哪些条件下生成ProductionBinding对象

  1. Produces修饰的bindingMethod方法生成ProductionBinding对象;

  2. 如果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绑定对象:

  1. 被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. (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;
  1. 如果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修饰的变量或普通方法),目前场景:

  1. componentMethod方法无参并且返回类型是MembersInjector,T生成MembersInjectionBinding;

  2. componentMethod返回类型既不是subcomponent又不是subcomponent.creator,有且仅有一个参数,当前参数生成MembersInjectionBinding;

  3. module节点中的被@Produces或@Provides或@Binds修饰的bindingMethod方法中的参数(其中@Binds修饰的方法有且仅有一个参数)类型是MembersInjector,T生成MembersInjectionBinding;

  4. Inject或AssistedInject修饰的构造函数的参数如果使用了MembersInjector,T生成MembersInjectionBinding;

  5. Inject修饰的变量如果使用了MembersInjector,T生成MembersInjectionBinding;

  6. Inject修饰的普通方法参数如果使用了MembersInjector,T生成MembersInjectionBinding。

DependencyRequest依赖对象

某一个对象A如果存在DependencyRequest依赖属性,表示当前对象A的实例化需要依赖于另一个对象B,那么另一个对象是谁?另一个对象B一定有一个Key属性,该Key对象被对象A的DependencyRequest依赖属性的Key属性匹配上了。

匹配即表示是同一个Key对象。还可以告诉你,对象A和另一个对象B表示的都是Binding绑定对象。

太精辟的解释,忍不住偷偷拿出小梳子。

DependencyRequest依赖属性

  1. RequestKind kind:根据传递的类型判断请求类型,自行查看RequestKind;

  2. Key key:生成key对象

  • (1)qualifier,element请求节点是否使用了Qualifier注解修饰的注解修饰;

  • (2)type,将传递的类型剥离外壳作为type;

  1. DaggerElement element:请求节点

  2. boolean isNullable:是否允许null,只要请求类型kind不是INSTANCE 或 element请求节点上使用了Nullable注解。

存在依赖的场景

  1. 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属性:当前方法节点;

  1. @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;

  1. @Pruduces修饰的bindingMethod生成一个依赖作为executorRequest属性:
  • (1)kind属性:PROVIDER;

  • (2)key属性:①ProductionImplementation作为qualifier;②Executor作为type;

  1. @Pruduces修饰的bindingMethod生成一个依赖作为monitorRequest属性:
  • (1)kind属性:PROVIDER;

  • (2)key属性:ProductionComponentMonitorr作为type;

  1. @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;

  1. 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;

  1. 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. (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属性;

  1. 如果key及其变异的type类型是Optional< T>,那么把type改成T生成新的newkey如果匹配到@BindsOptionalOf修饰的bindingMethod,并且如果newKey钥匙匹配到了Binding绑定对象,依赖属性如下:
  • (1)kind:newKey使用的RequestKind框架属性;
  • (2)key:newKey;
  • (3)isNullable:kind!=INSTANCE;
  1. 如果key要是的type类型是MembersInjector< T>,type作为key唯一属性,对T作为type生成新的newKey钥匙,newKey生成MembersInjectionBinding对象存储于InjectRegistryImpl,并且key钥匙和MembersInjectionBinding对象生成新的ProvisionBinding对象的依赖,两个依赖,一个是MembersInjectionBinding的依赖还有一个是ProvisionBinding对象的依赖,两个依赖完全一样;

  2. 如果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 讨论

源码解析github地址

kind、type贼多,理解起来感觉扯到了蛋~疼!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值