前言
可以加入575306647讨论dagger
这里是对Inject或InjectAssisted以及一些关联的注解进行规则校验,以及其他注解校验。
代码逻辑规则
具体代码体现出来的规则。
Inject和AssistedInject
整体了解
InjectProcessingStep类校验Inject和AssistedInject注解,InjectBindingRegistry对象是外部实例化后作为参数传递到当前InjectProcessingStep类。
InjectBindingRegistryImpl对象是用于实例化的InjectBindingRegistry,在InjectBindingRegistryImpl完成校验和Binding绑定对象的生成。
InjectProcessingStep类主要用于收集Inject或AssistedInject修饰的构造函数和Inject修饰的变量或普通方法:
-
Inject或AssistedInject修饰的构造函数,对该构造函数校验并且生成ProvisionBinding对象,并且继续校验该构造函数所在父节点是否存在被Inject修饰的变量或方法,如果存在对该父节点进行校验并且生成MembersInjectionBinding对象;
-
Inject修饰的变量或普通方法所在父节点校验,并且该父节点生成MembersInjectionBinding对象,并且对该父节点构造函数查看是否使用了Inject或AssistedInject注解,如果使用了,那么对该构造函数校验,并且生成ProvisionBinding对象。
-
注意以上的描述,我们需要知道,Inject既可以修饰变量或普通方法或构造函数,但是AssistedInject只可以用来修饰构造函数,详细情况下面具体规则。
Inject或AssistedInject修饰的构造函数
在validateConstructor类中校验,校验入口方法是validateConstructor;
对该构造函数校验,校验规则如下:
-
节点的构造函数不允许同时使用Inject注解和AssistedInject注解;
-
被Inject或AssistedInject修饰的构造函数不允许使用private修饰,也不能被Qualifier修饰的注解修饰;
-
被Inject或AssistedInject修饰的构造函数不能被Scope注解修饰的注解修饰;
-
Inject或AssistedInject修饰的构造函数的参数不能是Produced< T>和Producer< T>类型,并且对参数和参数类型做依赖校验,规则如下:
-
注:当前参数类型剥离RequestKind< T>类型得到T作为keyType(当然如果是RequestKind.INSTANCE,那么keyType就是参数类型)
-
(1)如果参数节点使用了@Assiste修饰,不进行下面的依赖校验;
-
(2)如果参数节点使用了Qualifier修饰的注解修饰,那么该类型注解不得超过1个;
-
(3)如果参数节点没有使用Qualifier修饰的注解修饰,那么keytype类型的构造函数不能使用AssistedInject修饰;
-
(4)如果参数节点没有使用Qualifier修饰的注解修饰,并且keyType节点使用了@AssistedFactory修饰,那么当前参数要么是T要么是Provider< T>,不能是Lazy< T>、Producer< T>或Produced< T>;
-
(5)keyType不能使用通配符;
-
(6)如果keyType是MembersInjector< T>(必须存在T)类型,那么对T进行成员注入校验:a.不能使用Qualifier注解修饰的注解修饰;b.T只能是类或接口,并且如果是泛型,那么泛型类型只能是类或接口或数组,数组只能是类或接口或数组,并且T不允许出现例如List类型(必须是List< T>类型);
-
被Inject或AssistedInject修饰的构造函数如果throws异常,那么异常一定要是RuntimeException或Error或两者子类;
-
使用了Inject或AssistedInject修饰的构造函数所在父节点不可以被private类使用,该构造函数所在父节点也不能使用abstract修饰,并且如果构造函数所在父节点是一个内部类,那么该内部类必须使用static修饰;
-
一个类最多只能有一个构造函数被Inject或AssitedInject修饰;
-
使用AssistedInject修饰的构造函数所