Android之dagger2实现依赖注入的原理
来源:互联网 发布:淘宝开学季文案 编辑:程序博客网 时间:2024/06/11 05:32
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)
@Moduleclass 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之dagger2实现依赖注入的原理
- Dagger2实现依赖注入之深入探究
- Android依赖注入之Dagger2注解介绍
- Dagger2-Android依赖注入框架的学习
- 【Android】【Dagger】Dagger2 依赖注入
- Dagger2实现依赖注入之一步一步带你入门
- 用Dagger2在Android中实现依赖注入
- 用Dagger2在Android中实现依赖注入
- 用Dagger2在Android中实现依赖注入
- 我的第一个Android依赖注入by dagger2
- 依赖注入的实现原理
- Android单排上王者系列之Dagger2注入原理解析
- Android项目使用Dagger2进行依赖注入
- Android中使用Dagger2进行依赖注入
- Android 依赖注入框架 Dagger2使用
- Android——Dagger2依赖注入框架
- android Dagger2依赖注入框架总结
- 依赖注入ButterKnife,Android Annotations,Dagger2
- Ubuntu 15.04 静态IP网络配置
- uva 1363 Joseph's Problem 等差数列
- Android ExifInterface对JPG文件的exif信息进行读写
- 哈理工OJ 1630 网线 【建图+Prime算法】
- leetcode 72. Edit Distance
- Android之dagger2实现依赖注入的原理
- 性能优化——内存优化建议(RAM)
- POJ 1390 Blocks DP *
- 1-gcc 选项
- Hadoop实战演练:搜索数据分析----TopK计算(2)
- 排序算法总结
- 对象的容纳
- HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
- ubuntu设置DNS永久生效