前言
继上篇Component及其关联的节点生成的对象,这篇文章主要针对使用Inject或AssistedInject注解生成绑定对象。
生成对象
在InjectProcessingStep处理Inject或AssistedInject修饰的节点,生成的对象存储于injectBindingRegistry对象中,该对象就是ComponentProcessor类中的被Inject修饰的变量injectBindingRegistry——通过InjectBindingRegistryModule的injectBindingRegistry方法(被@Binds修饰的方法)实例化InjectBindingRegistryImpl类实例。
Inject或AssistedInject修饰构造函数
Inject或AssistedInject修饰构造函数的生成ProvisionBinding绑定对象属性值如下:
-
ContributionType contributionType : ContributionType.UNIQUE;
-
Element bindingElement : 构造函数节点;
-
Key key:所在父类类型作为type生成的key对象;
-
Iterable provisionDependencies:如果参数没有使用@Assisted修饰,则当前依赖的参数,自行查看《多种类型查询总结》dependency依赖;
-
ImmutableSortedSet<MembersInjectionBinding.InjectionSite> injectionSites:使用Inject或AssistedInject的构造函数所在父类(以及该父类的父类深层次遍历直到非Object对象为止)里面所有使用Inject修饰的非private非static修饰的变量和普通方法生成InjectionSite对象,自行查看InjectionSite对象;
- 如果是Inject修饰的普通方法,并且Inject修饰的方法是重写父类的Inject修饰的方法,那么保留当前Inject修饰的方法即可(父级被重写的Inject方法不用处理)
-
BindingKind kind:绑定类型,INJECTION还是ASSISTED_INJECTION;
-
Optional scope:构造函数所在父类使用Scope注解修饰的注解,最多只有一个;
-
ProvisionBinding unresolved:如果当前构造函数所在父级节点和构造函数父级类型不匹配,例如List,但是节点使用的是List,那么生成一个从1开始生成也给未解析绑定作为当前属性;
还未结束:如果使用Inject或AssistedInject注释的构造函数所在父类还存在Inject修饰的非private非static方法或变量,那么对该父类生成MembersInjectionBinding对象,自行查看Inject修饰变量或普通方法。
Inject修饰变量或普通方法
Inject修饰的变量或普通方法所在的父节点生成MembersInjectionBinding绑定对象,属性值如下:
-
Key key:当前Inject修饰的节点的父节点类型作为type生成key对象;
-
ImmutableSet explicitDependencies:当前Inject修饰的节点的父节点(及其父类深入遍历直到非Object对象)使用Inject修饰的变量或方法(方法如果是重写父类中的Inject修饰的方法,那么只使用当前方法)参数生成的依赖;
-
TypeElement membersInjectedType:当前Inject修饰的节点的父节点;
-
Optional unresolved:如果父级节点和父级类型不匹配,例如List,但是节点使用的是List,那么生成一个从1开始生成也给未解析绑定作为当前属性;
-
ImmutableSortedSet<MembersInjectionBinding.InjectionSite> injectionSites:当前Inject修饰的节点的父节点(及其父类深入遍历直到非Object对象)使用Inject修饰的变量或方法(方法如果是重写父类中的Inject修饰的方法,那么只使用当前方法)生成的InjectionSite集合。
并未结束,当前父类及其深入遍历到非Object类
-
当前正在遍历的类作为type生成一个Key对象
-
当前正在遍历的类执行tryRegisterMembersInjectedType生成MembersInjectionBinding对象存储在membersInjectionBindings。
InjectionSite对象
当前对象表示使用Inject或AssistedInject修饰的构造函数所在的父节点(以及该父类的父类深层次遍历直到非Object对象为止)中使用Inject修饰的非private非static修饰的变量和方法生成InjectionSite对象,具体属性如下:
-
Kind kind:Inject修饰的变量-FIELD;Inject修饰的方法-METHOD;
-
Element element:Inject修饰的变量节点 或 Inject修饰的方法节点;
-
ImmutableSet dependencies:如果是方法则表示当前方法参数节点和参数类型生成的依赖,如果是变量表示当前变量节点和变量类型生成的依赖,自行查看;
总结
对上一章节的图形进一步完善,如下图所示:
打开https://www.iodraw.com/diagram/工具直接将上面制作文件拖进去即可查看