dagger源码剖析(一)BasicAnnotationProcessor源码解析(202106修正)

简介

github地址

更新20220221:最新版对dagger2.38.1源码解析

BasicAnnotationProcessor来源

implementation "com.google.auto:auto-common:0.10"

BasicAnnotationProcessor继承了AbstractProcessor,一个基础类注解处理器。

如果是一个简单的注解处理器,我们可以直接使用一个自定义AbstractProcessor处理对应的注解,可参考:Android循序渐进实现高逼格自定义ViewBinder。但是相对来说,dagger过于复杂,首先注解种类比较多:Inject,Component,ProductComponent,Provider,BindsInstance等;其次还需要针对注解进行校验,是否符合使用规范;并且逻辑代码也比较复杂,如果仅仅使用自定义AbstractProcessor也体现不了高质量代码的必要性。

BasicAnnotationProcessor代码质量非常高,里面的代码的写法非常值得我们学习借鉴。

源码思路整理

1.在BasicAnnotationProcessor中定义了一个Step接口,该接口用于处理某一类注解。代码如下:

public interface Step {//某一类注解集及其逻辑处理,该接口的实现者处理注解集的核心逻辑

    //存储该类注解集合
    Set<? extends Class<? extends Annotation>> annotations();

    //annotations中的注解集合的逻辑处理:注解使用规范校验,注解代码生成
    Set<? extends Element> process(SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation);
}

例如定义一个ComponentStep implements Step 表示处理Component相关注解逻辑:1.annotations()方法存放需要处理的注解集;2.process方法处理annotations()中注解集的逻辑代码,包括:校验,生成对应的逻辑代码。

2.BasicAnnotationProcessor是一个abstract抽象类,继承AbstractProcessor必然实现了以下方法:

(1) init(ProcessingEnvironment processingEnv):一些初始化操作,获取一些有用的系统工具类,该方法只会执行一次

(2) SourceVersion getSupportedSourceVersion() :BasicAnnotationProcessor并不知道继承者的版本,所以该方法没有实现,需要由继承者自己实现

(3) Set getSupportedAnnotationTypes():设置支持的注解类型,获取所有的Step接口annotations()方法中的注解集合,会执行多次

(4) boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment):注解内部逻辑的实现:1.会执行多次,并且调用process前一定会执行getSupportedAnnotationTypes()方法;2.process最后一次的执行roundEnvironment.processingOver() = true(前几次都是false),表示执行完毕

3.BasicAnnotationProcessor类定义了一个steps集合:ImmutableList<? extends Step> steps;,它的三个方法都是围绕着steps操作:

(1)init初始化steps集合;

(2)getSupportedAnnotationTypes()注解类型,取自于steps的step.annotations()

(3)process,通过for循环,执行step.process,实际的每个step逻辑执行方法

源码解析

一.定义Step接口

BasicAnnotationProcessor中的方法都是围绕着Step实现者操作:

public interface Step {//某一类注解集及其逻辑处理,该接口的实现者处理注解集的核心逻辑

    //存储该类注解集合
    Set<? extends Class<? extends Annotation>> annotations();

    //annotations中的注解集合的逻辑处理:注解使用规范校验,注解代码生成
    Set<? extends Element> process(SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation);
}

二.init(ProcessingEnvironment processingEnv)方法

 private ImmutableList<? extends Step> steps;

//一些初始化操作,获取一些有用的系统工具类
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
    super.init(processingEnv);
   ...
    this.steps = ImmutableList.copyOf(initSteps());
}

protected Iterable<? extends Step> initSteps() {
    throw new AssertionError(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值