Dagger2新手入门与使用基础教程

前言

前段时间,公司项目使用到了Dagger2,之前自己倒是听说过Dagger2,但是一直没有去使用,主要是因为入门难度相对于Rxjava,Retrofit要高不少,个人觉得这个难度并不是指的使用难度,而是一个理解难度。很多人就是代码照搬,写一个Component,一个Module就说自己会用Dagger2了,很可能你都不知道为什么你要去写这些。那么本篇文章将告诉你,Dagger2既然增加了代码量,那么,我们为什么还要去使用它。

什么是Dagger2

Dagger2是Dagger的升级版,是Android目前最好用的依赖注入框架,在编译期间自动生成代码,负责依赖对象的创建。第一代由Square公司共享出来,第二代则是由谷歌接手后推出的。

为什么我要使用Dagger2

我们使用Dagger2的主要目的是降低类与类之间的耦合度,举个例子。

这里有一个Person类,我们在这个类里面,想使用RichPerson类中的方法,那么我们就需要在Person类中拿到RichPerson的实例,也就是说Person和RichPerson耦合到一起了,违背了单一职责。如果还有很多类都要使用RichPerson类中的方法,那么就会有很多类跟RichPerson这个类耦合起来,一旦RichPerson构造方法变了,比如需要传入一个id才能使用,那么所有使用RichPerson的类都需要改,这个工作量可不小,而且这样也违背了开闭原则。
这个时候如果我们使用Dagger2,我们就可以在Person类中通过@Inject的方式拿到RichPerson实例而不需要在Person中去new RichPerson

使用(基于Kotlin)

在项目的build.gradle中,添加

apply plugin: 'kotlin-kapt'
dependencies {
 kapt 'com.google.dagger:dagger-compiler:2.14.1'
 implementation 'com.google.dagger:dagger:2.14.1'
}

这里我们就以MVP模式为例

1.传统MVP

在View层我们想要去获取数据,那么我们就要去通过构造拿到P层对象

这边gif我就不演示了,单纯的吐司提示而已,这种传统的MVP会在View层去实例化Persenter

2.Dagger2方式MVP

那么用Dagger2的方式,我们应该怎么在V层拿到P层的引用呢?

1.我们需要在P层的构造方法中添加一个@Inject注解,告诉Dagger2,我是可以通过注解拿到的

2.给你任何需要用@Inject注解拿对象的类创建一个Component类,这一步其实就是相当于告诉Dagger2,我这个类需要用到@Inject拿对象哦

3.Build——>Make Project,Dagger2会自动生成Dagger+***Component,比如

4.在V层中通过@Inject和Component拿到实例对象

到此,Dagger2基本使用完毕,我们可以通过@Inject拿到我们想要的任何对象(这个对象的构造方法前面需要添加@Inject),并且不需要new

V层拿P层,P层拿V层

上面的方式,我们可以在V层拿到P层的引用并且去调用P层的方法,那么如果我们需要在P层中拿到V层的对象,该怎么办呢?给P层也定义一个Component?不是的,这里,我们需要用到一个新的知识点,Module

那么,什么是Module呢,我个人的理解,就是把我本身提供出去,给其他类使用

1.在P层的构造中添加@Inject注解并添加V层的参数

2.给V层定义一个对应的Module,把自己提供出去

3.创建V层对应的Component,与上面不同的事,我们这里需要定义一个Module

4.Build——>Make Project,自动生成Dagger+***Component

5.调用

可能到这里你还是懵的,怎么调用一下这些方法,就把自己传过去了呢?莫慌,接下来带你去Dagger2生成的代码中去看看。

DaggerMainActivityComponent.builder()返回了一个Builder

builder是空构造,那么我们继续往下看

.mainActivityModule(MainActivityModule(this))把自己传进去,这里
做了一个非空判断之后给成员变量赋值,然后返回Builder本身

.build()如果上面传入的值是null,抛异常,否则调用Comopent构造并传入builder

把Builder中的module赋值给Component中的module

.inject(this)传入自身(这里的this就是activity本身)

调用injectMainPresenter方法,后面的getMainPresenter拿到presenter对象,然后给activity中@Inject注解的presenter赋值

new Presenter的时候传入了activity,完成赋值

至此我们的对象实例化完成。

总结

本文只是利用MVP的例子讲解一下Dagger2的使用,当然你可以在任何你想要实例化对象的地方用到Dagger2,说白了,就是用Dagger2代替了new,只需要记得,你想要什么对象,你就在那个对象的构造前面加上@Inject注解即可。如果你实例化的对象也需要用到你,那么你就给自己创建一个Module提供出去。

最后附上本文Demo的github地址,https://github.com/lxt1994/Dagger2Demo (本地下载)

以上纯属于个人平时工作和学习的一些总结分享,如果有什么错误欢迎随时指出,大家可以讨论一起进步。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

时间: 2018-04-10

kotlin使用Dagger2的过程全纪录

前言 Dagger2作为依赖注入神器,相信很多朋友都听说过它的大名.只不过它的有些概念,理解起来并不是那么清晰,并且在使用的过程中,也比较迷糊. Dagger2有Google接手开发的一个基于JSR-330标准的依赖注入框架,它会在编译期间自动生成相关代码,负责依赖对象的创建,达到解耦目的. 下面将详细介绍关于kotlin使用Dagger2的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. kotlin中配置Dagger2 在app模块的build.gradle文件中进

详解Dagger2在Android开发中的新用法

本文假设读者已经有一定Dagger2使用经验 使用疑惑 之前工作中一直在使用dagger2进行开发,用起来确实很爽,但是我从我第一次使用我就一直有一个问题或者说疑问(本人才疏学浅脑子不够使),通常情况下我们有如下清单 MyApplication,MyAppComponent,MyAppModule ActActivity,ActComponent,ActModule 简单解释下,MyAppModule提供全局单例功能,比如打印日志,ActModule提供Activity级别的功能比如发起网络请求

详解Kotlin 中使用和配置 Dagger2

前言 陆陆续续几篇文章已经讲解了项目中 Kotlin 如何配置.简单语法.DataBinding 配置,接下来就要说到 Kotlin 中的 Dagger2 了. 配置 Dagger2 项目中使用 Dagger2 ,首先还是添加依赖.同样的,因为要使用到注解处理,所以和 DataBinding 一样要添加 kapt 插件: apply plugin: 'com.android.application' ... apply plugin: 'kotlin-kapt' // kapt 插件 ... k

Kotlin中使用Dagger2可能遇到的坑解决

Dagger2是什么? Dagger2是一款基于Java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试. 一.Kotlin Dagger2 配置 build.gradle apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' ... dependencies { ... //dagger2 compile rootProject.ext.

dagger2使用方法教程之简明讲解

前言 Dagger 这个库的取名不仅仅来自它的本意"匕首",同时也暗示了它的原理.Jake Wharton 在对 Dagger 的介绍中指出,Dagger 即 DAG-er,这里的 DAG 即数据结构中的 DAG--有向无环图(Directed Acyclic Graph).也就是说,Dagger 是一个基于有向无环图结构的依赖注入库,因此Dagger的使用过程中不能出现循环依赖. Android开发从一开始的MVC框架,到MVP,到MVVM,不断变化.现在MVVM的data-bind

使用go module导入本地包的方法教程详解

go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具.到今天 Go1.14 版本推出之后 Go modules 功能已经被正式推荐在生产环境下使用了. 这几天已经有很多教程讲解如何使用 go module ,以及如何使用 go module 导入gitlab私有仓库,我这里就不再啰嗦了.但是最近我发现很多小伙伴在群里问如何使用 go module 导入本地包,作为初学者大家刚开始接触package的

Swift实现JSON转Model的方法及HandyJSON使用讲解

背景: 很多时候,我们从服务端请求下的数据都是Json格式,我们需要拿这些数据显示到我们的UI界面. 因此,我们的做法基本都会先将json转为方便使用的数据模型,或者也可以直接转字典解决. 在OC中,我们有很多优秀的第三方库帮助我们实现,比如MJExtension.JSONModel等,这些库基本都是利用runtime实现读取属性名并利用kvc重新赋值属性. 在Swift中,由于runtime的局限,比较出名的有SwiftyJSON.ObjectMapper等. 其中: 1.SwiftyJSON

CentOS 7下配置Ruby语言开发环境的方法教程

本文跟大家分享的是在CentOS 7下配置Ruby语言开发环境的方法教程,分享出来供大家参考学习,下面来看看详细的介绍: 安装Ruby 2.2 CentOS7存储库中的Ruby版本为2.0,但如果需要,可以使用RPM软件包安装2.2 1.添加CentOS SCLo软件集合存储库 [root@linuxprobe ~]# yum -y install centos-release-scl-rh centos-release-scl # set [priority=10] [root@linuxpr

使用docker快速搭建Spark集群的方法教程

前言 Spark 是 Berkeley 开发的分布式计算的框架,相对于 Hadoop 来说,Spark 可以缓存中间结果到内存而提高某些需要迭代的计算场景的效率,目前收到广泛关注.下面来一起看看使用docker快速搭建Spark集群的方法教程. 适用人群 正在使用spark的开发者 正在学习docker或者spark的开发者 准备工作 安装docker (可选)下载java和spark with hadoop Spark集群 Spark运行时架构图 如上图: Spark集群由以下两个部分组成 集

mac下使用brew 安装mongodb的方法教程

mac 系统常用的软件安装工具就是 homebrew 个人认为通过brew安装比较简单,下面介绍下如何安装 安装 mongodb wenxuezhangdeMacBook-Pro:~ wenxuezhang$ brew install mongodb 此图说明已经安装成功,安装的目录就是 /usr/local/Cellar/mongodb/3.2.9 第一次启动服务端,这里需要做一些准备工作. 默认mongodb 数据文件是放到根目录 data/db 文件夹下,如果没有这个文件,请自行创建. w

Oracle 11g下编译使用BBED的方法教程

BBED介绍: BBED(Oracle Block Browerand EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用.该工具不受Oracle支持,所以默认是没有生成可执行文件的,在使用前需要重新连接. 本文详细介绍了关于Oracle 11g下编译使用BBED的方法教程,下面话不多说,来一起看看详细的介绍: 环境:RHEL 6.4 + Oracle 11.2.0.4 1. 拷贝

微信小程序利用co处理异步流程的方法教程

本文主要介绍的是关于微信小程序利用co处理异步流程的方法教程,分享出来供大家参考学习,需要的朋友们下面来看看详细的介绍: co co是一个基于ES6 Generator特性实现的[异步流程同步化]写法的工具库. co需要使用Promise特性,所以,我们先来创建一个使用Promise来处理的异步方法: function myAsyncFunc() { return new Promise(function (resolve, reject) { setTimeout(function () {

Mysql 5.7.19 免安装版配置方法教程详解(64位)

官方网站下载mysql-5.7.19-winx64,注意对应系统64位或者32位,这里使用的是64位. 解压放置到本地磁盘.发现文件很大,大概是1.6G左右.删除lib文件夹下的.lib文件和debug文件夹下所有文件. 在主目录下创建my.ini文件,文件内容如下:(这里是简洁版,对应本机修改basedir和datadir的目录,根据需要可以自己扩充配置) [client] port=3306 default-character-set=utf8 [mysqld] basedir=D:\Jav

Windows 10系统下彻底删除卸载MySQL的方法教程

前言 本文介绍的是关于在Windows10系统下,如何彻底删除卸载MySQL的方法教程,分享出来供大家参考学习,下面来一起看看详细的介绍吧. 方法如下: 1>停止mysql服务 开始->所有应用->Windows管理工具->服务,将MySQL服务停止. 2>卸载mysql server 控制面板\所有控制面板项\程序和功能,将mysql server卸载掉. 3>将MySQL安装目录下的MySQL文件夹删除(我的安装目录是C:\Program Files (x86)\M