在此之前,请先看我的上一篇文章
dagger2的简单运用和详细解读http://blog.csdn.net/u014639129/article/details/52543708
本文会用通俗的言语对过程进行描述,具体的源码不粘出来,这里只简单的把核心的原理捋一捋,知道是怎么一回事,使得我们在开发时候,可以使用的得心应手即可。
下面开始正题
在编译时,由一下代码
public class MainPresenter {
@Inject
MainPresenter(MainContract.View view) {
mView = view;
}
}
dagger2会为MainPresenter 生成工厂类,用于创建出MainPresenter实例,这里是生成了MainPresenter_Factory (实现接口Factory)
@Module
class MainModule {
@privide MainContract.View provideMainView() {
return mView;
}
}
dagger2会为MainModule 的@provides方法生成对应的工厂类,这里是生成了
MainModule_ProvideMainViewFactory implements Factory(实现接口Factory)
这个对象的实例化其是这样的调用顺序:
1.MainPresenter_Factory用于创建MainPresenter对象,而
MainPresenter_Factory的实例化需要调用MainModule_ProvideMainViewFactory,
而MainModule_ProvideMainViewFactory的实例化需要调用MainModule,
而MainModule可以调用@provide方法提供构造。
那么最后MainPresenter_Factory就能被实例化出来,也就可以生成MainPresenter实例了。
现在对象是可以创建了,此时创建的MainPresenter实例是怎么就注入到MainActivity的成员mMainPresenter呢,不用多想,我们就可以猜得到,是通过Component和带@Inject注解的mMainPresenter对象关联起来的。
@Component(modules = {MainModule .class})
interface MainComponent{
void inject(MainActivity act);
}
由MainComponent,在编译时候会生成一个接口实现子类DaggerMainComponent
DaggerMainComponent implements MainComponent{
public static final class Builder {
public Builder mainModule(MainModule mainModule)
}
}
我们可以看到DaggerMainComponent的实例化,需要内部类Builder,
Builder的初始化需要MainModule,
MainModule是由我们在程序中手动new出来的.
编译时,根据component的void inject(MainActivity act)方法会生成
MainActivity_MembersInjector (MembersInjector的实现)
而MainActivity_MembersInjector的实例化需要
Provider mainPresenterProvider(这个provider其实上面提到的MainPresenter_Factory,它已经被实例化了,所以这里的MainActivity_MembersInjector也得到了实例化)
最后调用MainActivity_MembersInjector.inject(MainActivity activity),
也就让MainActivity中带@inject的对象进行了赋值,注入完成。
最后简单解读这一段代码:
DaggerMainComponent.builder()
.mainModule(new MainModule(this))
.build()
.inject(this);
首先:
通过new MainModule(this)创建MainModule实例,
而MainModule里面有provides的构造(提供)方法,
可以提供MainPresenter实例,即构造出MainPresenter实例。
其次:
有了实例,就要把实例进行注入(赋值)。
通过inject(this),把this引用传过去,使得刚才构造出来的MainPresenter实例化对象能赋值给this的引用变量mMainPresenter,从而实现注入。