目录
0. 前言
1. 依赖与注入
2. @Inject
3. @Module & @Provides
4. @Component
5. @Qualifier
6. Provider & Lazy
7. @Scope
8. 注入到Set和Map容器
9. Bind系列注解
10. dagger中依赖关系与继承关系
11. dagger.android
Kotlin中的注解
在开始讲解注解之前,先看下kotlin中的注解有何不同
我们知道以下kotlin代码:
class Test(var temp: Int)
转换为Java代码后是:
public final class Test {
private int temp;
public final int getTemp() {
return this.temp;
}
public final void setTemp(int var1) {
this.temp = var1;
}
public Test(int temp) {
this.temp = temp;
}
}
那么问题来了:
- 如何给构造函数添加注解?
- 如果代码为
class Test(@Ann var temp: Int)
,那么@Ann
这个注解是作用于哪里?(构造函数中的参数、变量、get或是set方法等) - 如何在kotlin中指定注解的目标?
构造函数添加注解
这个问题其实不难,研究过kotlin语法的应该都知道kotlin有constructor
关键字,上述写法是省略掉此关键字之后的主构造函数的写法,如果要使用注解,则需要显示写出constructor
关键字,如下:
class Test @Ann constructor(var temp: Int)
注解的默认目标
修改一下代码如下:
class Test constructor(@Ann var temp: Int) {
@Ann var foo = "Cmd"
}
猜猜这两个@Ann
注解分别在什么地方?
public final class Test {
@NotNull
private String foo;
private int temp;
/** @deprecated */
// $FF: synthetic method
@Ann
public static void foo$annotations() {
}
/* 省略掉get/set方法 */
public Test(@Ann int temp) {
this.temp = temp;
this.foo = "Cmd";
}
}
kotlin中注解首先根据@Target
选择目标,如果有多个指定目标都符合时,有如下优先级:
param
:即方法中的参数property
:一个对java不可见的属性(如上foo$annotations
)filed
:变量
所以在上述代码在构造函数中@Ann
的目标时构造函数的入参,而foo
前的@Ann
目标则是属性
指定注解目标
对于自定义的注解,也许我们可以指定@Target
限制注解目标范围,但对于三方提供的注解(例如javax.inject
中的@Inject
),怎样指定注解的目标呢?kotlin给出了一系列关键字来辅助: