Android-Dagger2dagger2入门到不放弃

Dagger2的使用与分析(1)--Inject

2019-04-01  本文已影响24人  saygoodbye_e92e

进入DaggerCarComponent类查看:

内部采用建造者模式来构建刚才上面我们自定义的接口CarComponent的实例,

内部通过构造函数来实例化DaggerCarComponent,我们来看一下这个构造函数

从上图可以得出:

 (a)构造函数内部调用 initialize(builder);

   (b)可以发现DaggerCarComponent.builder().build()

       其实也可以用DaggerCarComponent.create()

我们接着分析(a)中initialize(builder); 我们进入该函数内部

初始化也就是要获取 MembersInjector<MainActivity>这个属性的值

进入源码查看:MembersInjector

什么意思呢?将依赖项注入类型的实例的字段和方法中,

换言之,泛型T就是那个类型,也就是将依赖注入到T的字段或者方法中

,对应到我们这里就是将依赖注入到MainActivity的字段或者方法中。

接着我们看看,这个

this.mainActivityMembersInjector = MainActivity_MembersInjector.create(Car_Factory.create());

这个MainActivity_MembersInjector类

分析:(a)create方法,创建MainActivity_MembersInjector实例

        (b)MainActivity_MembersInjector构造函数,获取Provider<Car>的实例

           (3)注意到injectMembers和injectMCar这两个函数了吗,这个在哪里会用到呢,我往后看

DaggerCarComponent这个类中

关键点

injects函数中调用了

mainActivityMembersInjector.injectMembers(mainActivity);

而DaggerCarComponent实现了CarComponent,所以这里就指的是

DaggerCarComponent.create().injects(this);中的inject(this)

那我们接着来细看

   mainActivityMembersInjector.injectMembers(mainActivity);

有没有很激动,发现了吗,就是在这里,instance.mCar =mCarProvider.get();

这里的instance就是MainActivity,此处就是给MainActivity中的成员变量赋值的过程。

那么我们带着好奇看看这个

mCarProvider.get()到底是如何获取MainActivity成员变量的值呢

进入Provider<Car>

这个是一个典型的“饿汉式”的单例模式

我们来看一下Factory<Car>这个接口

到这里你可能就明白了.

我们再来会看一下:DaggerCarComponent中

this.mainActivityMembersInjector = MainActivity_MembersInjector.create(Car_Factory.create());

看下图:

一切都是那么的丝滑。

总结:整体思想是面向接口编程,依赖倒置(DI)和IOC的思想。然后利用apt来自动生成我们需要的代码

上一篇下一篇

猜你喜欢

热点阅读