你们好,我是苍王。
android
如下是我这个系列的相关文章,有兴趣能够参考一下,能够给个喜欢或者关注个人文章。设计模式
[Android]如何作一个崩溃率少于千分之三噶应用app--章节列表架构
相信有关注个人人,都会看过我第一编介绍的Todo-mvp源码体验,这是基础编。
app
这一章的难度理解难度将会很是大。框架
这个系列的课程适合研发有Android有一年半左右的同窗参考。ide
基于工做的问题,大型公司其实都不怎么使用这种注入框架,而是直接用代码完成解耦的。可是学习期框架架构,对咱们了解注解的使用和构建学习一些设计模式有着重要的做用。Dagger的设计的确很是精妙。源码分析
估计不少新手看Dagger2都会看到一头雾水,由于Dagger2使用的依赖反转的设计模式原则。组件化
举个例子,我去买东西,告诉老板我须要什么品类的东西,老板就说你等着,我拿给你就行了。学习
这个部分都是老板帮咱们完成了。ui
推荐一个很是好的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去作。
咱们看自定义的ToDoApplication,能够简单到看到mRepositoryComponnet是数据源在这里声明为全局的变量
这里会引用到自定义的ApplicationModule实体类,外面的变量经过provideContext获取ApplicationContext参数。
咱们这里先以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里面构造
咱们看到这里初始化
而后在TaskPresenter_Factory经过get方法来获取
这里还涉及到一个Listeners的方法
其实现是在TasksPresenter里面
TaskDetailPresenter的获取是在TaskDetailActivity
这里provideTaskIdProvider其引用是provideTaskId
provideTaskDetailContractViewProvider对应的是provideTaskDetailContractView
这里声明了FragmentScoped的定义域(Scope其定义是单例的定义域)
还有dependencies就是TaskRepositoryComponet的数据源来源
其getTasksRepositoryProvider 其提供者应该是getTasksRepository.
其实体对象获取方式,是经过初始化的时候传入TasksRepositoryComponent的实体
传入数据提供实体
在自定义的Application中创建数据实体
咱们分为近端和远端数据
这里@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,也能够扫码进群。我在这里期待大家的加入!!!