3.Dagger2.38.1源码解析-ComponentProcessor注解规则 续

前言

可以加入575306647讨论dagger

这里是对Inject或InjectAssisted以及一些关联的注解进行规则校验,以及其他注解校验。

代码逻辑规则

具体代码体现出来的规则。

Inject和AssistedInject

整体了解

InjectProcessingStep类校验Inject和AssistedInject注解,InjectBindingRegistry对象是外部实例化后作为参数传递到当前InjectProcessingStep类。

InjectBindingRegistryImpl对象是用于实例化的InjectBindingRegistry,在InjectBindingRegistryImpl完成校验和Binding绑定对象的生成。

InjectProcessingStep类主要用于收集Inject或AssistedInject修饰的构造函数Inject修饰的变量或普通方法

  1. Inject或AssistedInject修饰的构造函数,对该构造函数校验并且生成ProvisionBinding对象,并且继续校验该构造函数所在父节点是否存在被Inject修饰的变量或方法,如果存在对该父节点进行校验并且生成MembersInjectionBinding对象;

  2. Inject修饰的变量或普通方法所在父节点校验,并且该父节点生成MembersInjectionBinding对象,并且对该父节点构造函数查看是否使用了Inject或AssistedInject注解,如果使用了,那么对该构造函数校验,并且生成ProvisionBinding对象。

  3. 注意以上的描述,我们需要知道,Inject既可以修饰变量或普通方法或构造函数,但是AssistedInject只可以用来修饰构造函数,详细情况下面具体规则。

Inject或AssistedInject修饰的构造函数

在validateConstructor类中校验,校验入口方法是validateConstructor;

对该构造函数校验,校验规则如下:

  1. 节点的构造函数不允许同时使用Inject注解和AssistedInject注解;

  2. 被Inject或AssistedInject修饰的构造函数不允许使用private修饰,也不能被Qualifier修饰的注解修饰;

  3. 被Inject或AssistedInject修饰的构造函数不能被Scope注解修饰的注解修饰;

  4. 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>类型);

  1. 被Inject或AssistedInject修饰的构造函数如果throws异常,那么异常一定要是RuntimeException或Error或两者子类;

  2. 使用了Inject或AssistedInject修饰的构造函数所在父节点不可以被private类使用,该构造函数所在父节点也不能使用abstract修饰,并且如果构造函数所在父节点是一个内部类,那么该内部类必须使用static修饰;

  3. 一个类最多只能有一个构造函数被Inject或AssitedInject修饰;

  4. 使用AssistedInject修饰的构造函数所

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值