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 (本地下载)

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

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

(0)

相关推荐

  • 详解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有Google接手开发的一个基于JSR-330标准的依赖注入框架,它会在编译期间自动生成相关代码,负责依赖对象的创建,达到解耦目的. 下面将详细介绍关于kotlin使用Dagger2的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. kotlin中配置Dagger2 在app模块的build.gradle文件中进

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

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

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

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

  • 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新手入门与使用基础教程

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

  • 30分钟就入门的正则表达式基础教程

    本文目标30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 如何使用本教程 最重要的是--请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门--除非你是超人 :) 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难.当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的--我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以

  • 新手入门学习Spring Freemarker教程解析

    初步学习freemarker ,先做一个简单的HelloWord程序! 新建一个WEB工程,下载(我使用的是freemarker-2.3.20)freemarker并导入freemarker.jar,在WEB-INF下新建文件夹templates用于存放模版文件 在templates下新建test.ftl,这是示例模版文件.内容就是HTML内容,里面带有一个标记符,用于将来进行变量替换,内容如下: <html> <head> <title>freemarker测试<

  • C语言文件操作零基础新手入门保姆级教程

    目录 一.前言 二.文件操作基础知识 ①什么是文件 ②数据文件类型 ③数据如何存储 ④如何读取二进制文件 ⑤什么是文件名 ⑥文件缓冲区 ⑦文件指针 三.文件操作函数 ①fopen 与 fclose ②fputc与fgetc ③fputs与fgets ④fprintf与fscanf ⑤fwrite与fread ⑥fseek与ftell与rewind ⑦ferror与feof ⑧补充函数 sscanf sprintf ⑨补充函数perror  strerror 总结 一.前言 我们如何使我们设计的程

  • Python pygame新手入门基础教程

    目录 pygame简介 pygame实现窗口 设置屏幕背景色 添加文字 绘制多边形 绘制直线 绘制圆形 绘制椭圆 绘制矩形 总结 pygame简介 pygame可以实现python游戏的一个基础包. pygame实现窗口 初始化pygame,init()类似于java类的初始化方法,用于pygame初始化. pygame.init() 设置屏幕,(500,400)设置屏幕初始大小为500 * 400的大小, 0和32 是比较高级的用法.这样我们便设置了一个500*400的屏幕. surface

  • JavaScript基础教程——入门必看篇

    JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. 一. JavaScript 1.什么是JavaScript JavaScript是一种描述性语言,也是一种基于对象(Object)和事件驱动(Event Driven)的,并具有安全性的脚本语言. 2.JavaScript的特点 JavaScript主要用来向HTML页面添加交互行为. JavaS

  • 微信小程序开发入门基础教程

    微信小程序开发入门基础教程 本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果. 开发准备工作获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的"设置"-"开发者设置"中,查看到微信小程序的 AppID 了,注意不可直接使用服务号或订阅号的 AppID . 下载开发工具 下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/dow

  • AngularJs 60分钟入门基础教程

    AngularJs是一个不错的用于开发SPA应用(单页Web应用)的框架.单页Web应用(single page web application,SPA),就是只有一张Web页面的应用.浏览器一开始会加载必需的HTML.CSS和JavaScript,所有的操作都在这张页面上完成,由JavaScript来控制不同view在这个页面上的呈现.本文源于Youtube上一个不错的AngularJs的入门教程视频:AngularJS Fundamentals In 60-ish Minutes,主要讲解了

  • Java Mybatis框架入门基础教程

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个

  • Android入门之源码开发基础教程

    本文讲述了Android入门之源码开发基础教程.分享给大家供大家参考,具体如下: 下载 Android 源码之后,接下来就是学习或者进行开发. 在开发之前,谈一些开发必备知识或者工具,工欲善其事必先利其器嘛! 在前面一篇<Android入门之使用eclipse进行源码开发的方法>中基本上说了开发使用工具. 但是我们如何使用模拟器开发呢?! 当然你去删除或者增加app到模拟器就不可以按常规来操作了,花 5 -10 分钟了解一下,如果你有需要. 0. 编译源码 直接在下载的源码根目录下面,执行:

随机推荐