MVP + Dagger2源码体验

大家好,我是苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表


相信有关注我的人,都会看过我第一编介绍的Todo-mvp源码体验,这是基础编。

这一章理解难度将会非常大。

这个系列的课程适合研发有Android有一年半左右的同学参考。

基于工作的问题,大型公司其实都不怎么使用这种注入框架,而是直接用代码完成解耦的。但是学习期框架架构,对我们了解注解的使用和构建学习一些设计模式有着重要的作用。Dagger的设计的确非常精妙。


一.基础介绍

估计很多新手看Dagger2都会看到一头雾水,因为Dagger2使用的依赖反转的设计模式原则。

举个例子,我去买东西,告诉老板我需要什么品类的东西,老板就说你等着,我拿给你就好了。

这个部分都是老板帮我们完成了。

推荐一个非常好的Dagger2的入门文章给大家,里面都是Dagger2基本的使用原理,和一般的架构设计,看完之后估计大家应该不会再一头雾水。

Dagger2 入门,以初学者角度.

Google官方MVP+Dagger2架构详解【从零开始搭建android框架系列(6)】


如果没有Dagger基础,而且不看介绍,然后直接看一下的内容,估计你会一头雾水。(最好下源码对着看)

没Dagger基础一定要看介绍

没Dagger基础一定要看介绍

没Dagger基础一定要看介绍

重要的事情说三次!!!



二.源码分析

(一).引用相关

关于引用,需要使用android-apt的引用

还有Dagger2所需要的依赖


一开始下载下来,打开XXActivity的文件发现都会报红,然后需要我们make projects一次,Dagger2会自动生成一些Dagger注入的类。

编译完成后,我们会在apt的文件夹里面,看到生成的Dagger代码,很显然是通过apt代码编写的代码。

这里的套路和MVVM有点相似,但是MVVM是源码就提供MVVM的自动编码,而Dagger2需要apt去做。

(二).Application注解

我们看自定义的ToDoApplication,可以简单到看到mRepositoryComponnet是数据源在这里声明为全局的变量

这里会引用到自定义的ApplicationModule实体类,外面的变量通过provideContext获取ApplicationContext参数。


(三).Component注解

我们这里先以TaskDetailActivity为例吧(这里不对Dagger2的注入方式再进行介绍,可以看我基础介绍里面的网址学习)

我们看到DaggerTaskDetailComponent是使用了建造者模式的链式结构。

我们看到的是自动生成的DaggerTaskDetailComponent是继承TaskDetailComponent

我们看到起使用@Provider就会生成Provider类型的变量

使用@Inject标志的变量就会被声明为MembersInjector的变量

因为使用了inject(this)还会将整个TaskDetailActivity声明为MembersInjector的变量


看到这里应该很清楚,起初始化的时候,还会调用intialize方法

这里很明显,每个变量都会通过XXXFactory.create来获取相应的创建出来(这里使用很明显就是工厂模式)

Module声明的实体主要是用到了工厂模式生成

使用inject(this)的时候会调用injectMembers的方法替换变量

深入到TaskDetailActivity_MembersInjector实现类,初始Presenter对象

这里初始化的时候会输入PresenterProvider的变量

其是通过静态的create方法做成工厂的。

这里是DaggerTaskDetailComponent的intialize的时候会加载Provider

继续是工厂类创建

其会创建出一个工厂类的方法出来。

这里继续下来是很酷的是建造者模式Buidler。

可以看出Component的核心源码系建造者模式。

这里需要确立的是build一定是在inject之前的,先输入参数建造才能注入。

Presenter是什么时候被初始化的呢?

我们看到TaskActivity里面注入Presenter

获取taskPresenterModule的对象

TaskPresenter里面构造


(1)关于tasksPresenterMembersInjector的获取

我们看到这里初始化

然后在TaskPresenter_Factory通过get方法来获取

这里还涉及到一个Listeners的方法

其实现是在TasksPresenter里面


(2)关于TaskDetailPresenter

TaskDetailPresenter的获取是在TaskDetailActivity


这里provideTaskIdProvider其引用是provideTaskId

provideTaskDetailContractViewProvider对应的是provideTaskDetailContractView

这里声明了FragmentScoped的定义域(Scope其定义是单例的定义域)

还有dependencies就是TaskRepositoryComponet的数据源来源

其getTasksRepositoryProvider 其提供者应该是getTasksRepository.

其实体对象获取方式,是通过初始化的时候传入TasksRepositoryComponent的实体

传入数据提供实体

在自定义的Application中建立数据实体

(四).关于数据实体TasksRepository

我们分为近端和远端数据

这里@Qualifer是自定义命名的注解

本地注解
远端注解

@声明数据单例

初始化中带有本地和远端的注解对象

本地数据注解
远端数据注解

在DaggerTasksRepositoryComponent中联通这些注解对象

通过getTasksRepository获取到实体到数据流实体

对象获取
数据流实际初始化

设定通过单例@Singleton的方法获取远端和近端的数据

其单例的声明是通过enum枚举,然后声明INSTANCE的方式,声明单例的。

这里特别说名一下一个没有scope的组件component不可以依赖一个有scope的组件component。子组件和父组件的scope不能相同。我们通常的ApplicationComponent都会使用Singleton注解(),也就会是说我们如果自定义component必须有自己的scope。


三.总结

Dagger2注解,框架最重要理解的就是依赖倒置的设计原则。

Dagger2源码的套路

Module->Factory.create 工厂创建

Component->  XXXComponent.Bulider  建造者模式

Singleton Scoped->   利用enum和INSTANCE标示 单例模式

理解这些设计模式,一旦你真的看懂Dagger2的设计模式,你会觉得Dagger2的设计非常精妙。可以理解其Apt的注解编写的设计真的非常值得学习,以后有机会会给大家分享Apt编写代码的一些详解。


这次的源码分析就到这里

下一节应该会分析MVP +RXJava的源码,敬请期待!!!


我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习和架构思想的的交流。

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容