Dagger2的使用与分析(1)--Inject
进入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来自动生成我们需要的代码