返回

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

Android

代码逻辑规则

Inject或InjectAssisted注解校验

Inject注解用于标记需要注入的字段或方法,而InjectAssisted注解用于标记需要注入的构造函数参数。这两个注解都位于dagger.internal.codegen包下。

对于Inject注解,ComponentProcessor会检查该注解是否被用于类字段或方法上,并确保该字段或方法是public或protected访问权限。对于InjectAssisted注解,ComponentProcessor会检查该注解是否被用于构造函数参数上,并确保该参数是final类型。

其他注解校验

除了Inject和InjectAssisted注解之外,ComponentProcessor还会对其他一些注解进行校验,包括:

  • @Binds: 检查该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型与方法参数类型相同。
  • @BindsOptionalOf: 检查该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型是Optional类型。
  • @Provides: 检查该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型与方法参数类型相同。
  • @Produces: 检查该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型是Producer类型。

规则校验示例

为了更好地理解这些注解的校验规则,这里提供一个示例代码:

@Component
interface MyComponent {
    void inject(MyClass myClass);
}

class MyClass {
    @Inject
    public MyClass() {}

    @Inject
    private String name;

    @InjectAssisted
    public MyClass(String name) {
        this.name = name;
    }

    @Binds
    public String bindString(String string) {
        return string;
    }

    @BindsOptionalOf
    public Optional<String> bindOptionalString(String string) {
        return Optional.of(string);
    }

    @Provides
    public String provideString() {
        return "Hello, world!";
    }

    @Produces
    public Producer<String> produceString() {
        return new Producer<String>() {
            @Override
            public String get() {
                return "Hello, world!";
            }
        };
    }
}

对于这段代码,ComponentProcessor会进行如下校验:

  • MyClass类上的@Inject注解校验:校验该注解是否被用于类字段或方法上,并确保该字段或方法是public或protected访问权限。
  • MyClass构造函数上的@InjectAssisted注解校验:校验该注解是否被用于构造函数参数上,并确保该参数是final类型。
  • MyClass类中的bindString方法上的@Binds注解校验:校验该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型与方法参数类型相同。
  • MyClass类中的bindOptionalString方法上的@BindsOptionalOf注解校验:校验该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型是Optional类型。
  • MyClass类中的provideString方法上的@Provides注解校验:校验该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型与方法参数类型相同。
  • MyClass类中的produceString方法上的@Produces注解校验:校验该注解是否被用于一个方法上,并确保该方法是public或protected访问权限,且返回类型是Producer类型。

通过对这些注解的校验,ComponentProcessor可以确保Dagger2生成的代码是正确的,并符合Dagger2的规范。