不多說,先帖基本教程,我就是看著學會的。一定要理解,否則下面的看不下去。
http://www.open-open.com/lib/view/open1474442495481.html
看完后,我們稍作修改,改變被注入的對象的構造器
比如這樣,因為我們會常在MVP的Present中建立對Activity的引用
public class Pot {
@Inject
public Rose rose;
public MainActivity activity ;
@Inject
public Pot(MainActivity mainActivity){
activity = mainActivity;
}
public String show() {
return rose.whisper();
}
}
這個時候我們就會想,MainActivity怎么傳入進來? 我們知道注入的時候來源只有兩種,一種是構造函數,第二種是Model,對于第一種,我們顯然不可能將MainActivity的構造函數用來注射,因為這樣我們得到的MainActivity和我們當前的實例肯定不一樣,所以我們用第二種。我們將MainActivity設置為Model,并寫一個方法:
@Provides
public MainActivity getActivity(){
return this ;
}
這樣在Component獲取類的實例,我們可以將當前MainActivity的實例傳入進去,但是運行后我們發現,還是不一樣,原因是Model仍然會再初始化一次,然后調用getActivity()方法。
思索無解,我們找源碼
我們注意到:
在MainActivity中我們是這么調用的
DaggerMainActivityComponent.create().inject(this);
我們很好奇,create是怎么構造的,我們進入內部
我們來看看生成的代碼的源碼。
在DaggerMainActivityComponent 中有一個Builder構建器。我們來看這個。
public static final class Builder {
private MainActivity mainActivity;
private RoseModel roseModel;
private Builder() {}
public MainActivityComponent build() {
if (mainActivity == null) {
this.mainActivity = new MainActivity();
}
if (roseModel == null) {
this.roseModel = new RoseModel();
}
return new DaggerMainActivityComponent(this);
}
public Builder roseModel(RoseModel roseModel) {
this.roseModel = Preconditions.checkNotNull(roseModel);
return this;
}
public Builder mainActivity(MainActivity mainActivity) {
this.mainActivity = Preconditions.checkNotNull(mainActivity);
return this;
}
}
這里有兩個Model,我們只看MainActivity
我們注意到create()的過程,他會判斷當前mainActivity是否為空, 如果為空,我們重新創建一個,問題就出在這,廢話,初始創建當然為空。
這個時候我們初一到有一個mainActivity的方法,哈哈,可以給我們設置mainActivity的值。所以我們先不調用create(),我們這么來,在MainActivity中
將
DaggerMainActivityComponent.create().inject(this);
改為
DaggerMainActivityComponent.builder().mainActivity(this).build().inject(this);
這樣我們就可以傳入自己的Model實例。
事實上測試,我們正確了,??。
來看看注入的代碼。
private void initialize(final Builder builder) {
this.getActivityProvider = MainActivity_GetActivityFactory.create(builder.mainActivity);
...
}
看到沒,我們設置了Model的實例,之后的Provider類(抽象工廠)是基于我們的自定義的Model來設置的,這樣就完成對MainActivity的自定義的注入。