代碼示例
// 對象提供方
class Tiger {
// @Inject:該註解用於類構造方法上表示該類可以被Dagger2實例化對象後供注射器使用.
@Inject
public Tiger() {
}
public void sleep() {
System.out.println("Tiger sleeping");
}
}
// 對象使用者
public class Zoo {
// @Inject: 該註解用於成員變量上代表注射器可以爲該成員變量賦值對象.
@Inject
Tiger tiger;
@Test
public void 案例一() {
DaggerZooComponent.create().inject(this);
tiger.sleep();
}
}
// 注射器
// @Component: 該註解是用來創造對象提供方和對象使用間的橋樑,如何將對象賦值給成員變量都是由它來做的.
@Component
interface ZooComponent {
Zoo inject(Zoo zoo);
}
Dagger2生成代碼閱讀
主要說的是
@Inject
註解提供對象給注射器使用.
就着上面的案例來看下Degger2生成的代碼,生成的代碼在build\generated\sources\annotationProcessor\..
文件夾中.
DaggerZooComponent.create()
create()
用來生成DaggerZooComponent
對象,DaggerZooComponent
的父類是ZooComponent
接口,它重寫了接口中的inject()
方法.
final class DaggerZooComponent implements ZooComponent {
// create()方法創建DaggerZooComponent()對象
public static ZooComponent create() {
return new Builder().build();
}
static final class Builder {
private Builder() {
}
public ZooComponent build() {
// build()方法返回DaggerZooComponent對象.
return new DaggerZooComponent();
}
}
}
.inject(this)
對象注入
使用DaggerZooComponent
對象將Dagger2
創建的Tiger
對象注入到Zoo
中.
final class DaggerZooComponent implements ZooComponent {
// 接口中的方法,由DaggerZooComponent實現,該方法就是用來向Zoo對象中注入Tiger對象的.
@Override
public Zoo inject(Zoo zoo) {
// zoo就是inject(this)中的this了,代表Zoo對象.
return injectZoo(zoo);
}
private Zoo injectZoo(Zoo instance) {
// 接着調用了 Zoo_MembersInjector.injectTiger(instance, new Tiger());
// new Tiger(): 這個對象就是由Dagger2創建的Tiger對象.
// instance: 代表Zoo對象.
Zoo_MembersInjector.injectTiger(instance, new Tiger());
return instance;
}
}
Zoo_MembersInjector.injectTiger(instance, new Tiger())
最終的賦值動作就是由injectTiger()
方法做的.
public final class Zoo_MembersInjector implements MembersInjector<Zoo> {
@InjectedFieldSignature("com.yey.dagger2.Zoo.tiger")
public static void injectTiger(Zoo instance, Object tiger) {
// instance.tiger: 爲Zoo中字段tiger
// tiger: 爲上一步方法DaggerZooComponent.injectZoo()創建的Tigerd對象.
instance.tiger = (Tiger) tiger;
}
}
通過一個非常簡單的案例來熟悉Dagger2到底爲各個對象做了些什麼,下面會將案例複雜化.