返回
Dagger2.38.1源码解析-ComponentProcessor注解规则(续)
Android
2023-10-10 11:04:32
代码逻辑规则
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的规范。