不多说,先帖基本教程,我就是看着学会的。一定要理解,否则下面的看不下去。
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的自定义的注入。