Android之dagger2实现依赖注入的原理

dagger2实现注入的原理

在此之前,请先看我的上一篇文章
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,从而实现注入。

你可能感兴趣的:(安卓android)