Dagger2源码分析

4 篇文章 0 订阅
2 篇文章 0 订阅

前言

上文dagger2入门教程以一个实例介绍了dagger2的相关组件,概念和使用的方法。本文继续以上文的例子为基础,对其进行源码分析。

1、 dagger2生成的代码

如下图所示,右边是我们申明的Component和Module,左边是dagger2生成的代码。从图中可以看出,我们申明了ActivityComponent,dagger2就会给我们生成对应的Dagger2ActivityComponent。其他的类都是dagge2内部用来负责依赖注入的工厂类。
生命的接口和生成代码之间的对应关系

我们再看看dagger2内部的工厂类之间的关系

  • Component:Ioc控制器,通过inject传入对象,对对象属性进行赋值
  • Provider:对象生成器,每一个类型的对象对应一个Provider。Provider依赖客户端传入的Module或者Dependency Component来实际的构造对象。
  • MemberInjector:给对象属性的赋值,每有一个对象有属性需要注入,那么就存在一个MemberInjector,MemberInjector依赖Provider来生成对象。

2、源码分析

2.1 Component的生成过程

(1) Component依赖的构造
上图是我们申明的FragmentComponent,下图是Dagger2生成的Dagger2FragmentComponent。

可以看出FragmentComponent每申明一个modules和dependencies,在Dagger2FragmentComponent就有一个对应的属性,这些属性需要我们在构造Dagger2FragmentComponent手动的传进去

再看看我们是怎么传进去的
这里写图片描述

(2)Component Provider的构造

从下图中可以看出Dagger2Component需要注入4个对象,包括3个类型的对象(ActivityObj,ActivityScopeObj,FragmentObj),有2个类需要被注入(Dagger2Fragment,FragmentObj,因为他们存在@Inject修饰的属性)

与之对象的在生成的Dagger2FragmentComponent中就存在3个Provider(一种类型的对象对应一个),还有2个MemberInjector,Provider负责生成对象,MemberInjector负责去给被注入的对象属性赋值。

这里写图片描述

虽然Dagger2ActivityComponent里面存在Provider< ActivityObjProvider>,但是Provider< ActivityObjProvider>是私有属性,FragmentComponent无法利用它来生成ActivityObj的对象。因此ActivityComponent可以通过在申明的时候暴接口来提供对外提供对象的能力(eg:ActivityComponent.activityObj),在Dagger2ActivityComponent里面activityObj的实现,实际也是通过Provider< ActivityObjProvider>来生成对象。

注意:Dagger2里面都是按照返回值的类型进行对象匹配,与方法名无关

这里写图片描述

2.2 Provider的生成过程

2.2.1 非Scope修饰的情况

这里写图片描述

2.2.2 Scope修饰的情况

相比较于非Scope修饰的情况,provideActivityScopeProvider用ScopeProvider裹了一层,在ScopeProvider里面,用一次变量result来保存了ActivityModule.provideActivityScopeOb返回的值,只有第一次调用的时候,才会通过ActivityModule.provideActivityScopeOb去生成ActivityScopeObj对象,后续直接用result来返回。

因此,可以得出结论:只要是Scope修饰的方法,在同一个Component里面总返回一份单例

  • 理论上来说:Component和其被注入对象的生命周期相同,比如说AppComponent其存在的生命周期=App的生命周期,ActivityComponent的生命周期=Activity的生命周期

我们不要被Scope的名称所迷惑了,比如说,ActivityScope,SingleInstance,AppScope等。他们的本质都是相同的,只要用Scope修饰了返回的方法,他们在同一个Component内返回一个单例。唯一用于区分他们大小的就是Component之间的依赖关系。比如说AppScope之所以比ActivityScope大,是因为AppScope修饰了AppComponent,ActivityScope修饰了ActivityComponent,同时ActivityComponent依赖于AppComponent。因此AppScope>ActivityScope。

这里写图片描述

2.2.3 Inject修饰构造函数的情况

这里写图片描述

2.3 MemberInjector注入的过程

这里写图片描述

2.4 总体的注入流程回顾

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值