5.Dagger2.38.1源码解析-ComponentProcessor注解生成对象 续

前言

继上篇Component及其关联的节点生成的对象,这篇文章主要针对使用Inject或AssistedInject注解生成绑定对象。

生成对象

在InjectProcessingStep处理Inject或AssistedInject修饰的节点,生成的对象存储于injectBindingRegistry对象中,该对象就是ComponentProcessor类中的被Inject修饰的变量injectBindingRegistry——通过InjectBindingRegistryModule的injectBindingRegistry方法(被@Binds修饰的方法)实例化InjectBindingRegistryImpl类实例。

Inject或AssistedInject修饰构造函数

Inject或AssistedInject修饰构造函数的生成ProvisionBinding绑定对象属性值如下:

  1. ContributionType contributionType : ContributionType.UNIQUE;

  2. Element bindingElement : 构造函数节点;

  3. Key key:所在父类类型作为type生成的key对象;

  4. Iterable provisionDependencies:如果参数没有使用@Assisted修饰,则当前依赖的参数,自行查看《多种类型查询总结》dependency依赖

  5. ImmutableSortedSet<MembersInjectionBinding.InjectionSite> injectionSites:使用Inject或AssistedInject的构造函数所在父类(以及该父类的父类深层次遍历直到非Object对象为止)里面所有使用Inject修饰的非private非static修饰的变量和普通方法生成InjectionSite对象,自行查看InjectionSite对象

  • 如果是Inject修饰的普通方法,并且Inject修饰的方法是重写父类的Inject修饰的方法,那么保留当前Inject修饰的方法即可(父级被重写的Inject方法不用处理)
  1. BindingKind kind:绑定类型,INJECTION还是ASSISTED_INJECTION;

  2. Optional scope:构造函数所在父类使用Scope注解修饰的注解,最多只有一个;

  3. ProvisionBinding unresolved:如果当前构造函数所在父级节点和构造函数父级类型不匹配,例如List,但是节点使用的是List,那么生成一个从1开始生成也给未解析绑定作为当前属性;

还未结束:如果使用Inject或AssistedInject注释的构造函数所在父类还存在Inject修饰的非private非static方法或变量,那么对该父类生成MembersInjectionBinding对象,自行查看Inject修饰变量或普通方法

Inject修饰变量或普通方法

Inject修饰的变量或普通方法所在的父节点生成MembersInjectionBinding绑定对象,属性值如下:

  1. Key key:当前Inject修饰的节点的父节点类型作为type生成key对象;

  2. ImmutableSet explicitDependencies:当前Inject修饰的节点的父节点(及其父类深入遍历直到非Object对象)使用Inject修饰的变量或方法(方法如果是重写父类中的Inject修饰的方法,那么只使用当前方法)参数生成的依赖;

  3. TypeElement membersInjectedType:当前Inject修饰的节点的父节点;

  4. Optional unresolved:如果父级节点和父级类型不匹配,例如List,但是节点使用的是List,那么生成一个从1开始生成也给未解析绑定作为当前属性;

  5. ImmutableSortedSet<MembersInjectionBinding.InjectionSite> injectionSites:当前Inject修饰的节点的父节点(及其父类深入遍历直到非Object对象)使用Inject修饰的变量或方法(方法如果是重写父类中的Inject修饰的方法,那么只使用当前方法)生成的InjectionSite集合。

并未结束,当前父类及其深入遍历到非Object类

  • 当前正在遍历的类作为type生成一个Key对象

  • 当前正在遍历的类执行tryRegisterMembersInjectedType生成MembersInjectionBinding对象存储在membersInjectionBindings。

InjectionSite对象

当前对象表示使用Inject或AssistedInject修饰的构造函数所在的父节点(以及该父类的父类深层次遍历直到非Object对象为止)中使用Inject修饰的非private非static修饰的变量和方法生成InjectionSite对象,具体属性如下:

  1. Kind kind:Inject修饰的变量-FIELD;Inject修饰的方法-METHOD;

  2. Element element:Inject修饰的变量节点 或 Inject修饰的方法节点;

  3. ImmutableSet dependencies:如果是方法则表示当前方法参数节点和参数类型生成的依赖,如果是变量表示当前变量节点和变量类型生成的依赖,自行查看;

总结

对上一章节的图形进一步完善,如下图所示:

在这里插入图片描述

图形制作文件

打开https://www.iodraw.com/diagram/工具直接将上面制作文件拖进去即可查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值