简单介绍 Dagger2 的入门使用

依赖注入

在介绍 Dagger2 这个之前,必须先解释一下什么是依赖注入,因为这个库就是用来做依赖注入的。所以这里先简单用一句话来介绍一下依赖注入:
依赖注入是一种设计模式,它允许对象在运行时注入其依赖项。而不是在编译时确定(也就是硬编码)。通过这种方式,可以更好地解耦代码,提高测试性和可维护性。
详细了解依赖注入,这里建立先看完这个博文,详细介绍了这个概念和实现方式:Java 基础知识之 依赖注入(Dependency Injection)

Dagger2

上面的博客已经介绍了,依赖注入有很多不同的框架都可以做这个事,那为什么选择 Dagger2 呢?对于后端开发可能会用 Spring,而对于 Android 开发,只能用 Dagger2 了。这主要是因为这个库本身就是由 Google 推出的,而且它通过注解处理器生成高效的依赖注入代码,避免了运行时反射产生的性能开销。在 Android 源代码项目中,广泛使用了这个库。

这里重点注意 Dagger2 这个库与其他依赖注入库的区别在于 Dagger2 使用的是注解处理器,而不是运行时反射。如果不了解这两个方式的区别可以看一些这个:
制作自己的ButterKnife(使用AutoService和APT注解处理器在编译期生成Java代码)
制作自己的 @OnClick、@OnLongClick(告别setOnClickListener,使用注解、反射和动态代理)
使用注解处理器可以在编译时生成代码来完成功能,这比使用运行时反射要快很多。而性能在 Android 这种嵌入式设备中相当重要,因此对于 Android 开发者来说,如果使用依赖注入,这个库就是必选的。

基本概念

在使用 Dagger2 这个库时,主要会有三个角色:

  • 依赖需求方:就是需要依赖对象的那些类。例如一个人想要玩电脑,那么他就必须得有一台电脑,因此这个人就是依赖需求方;
  • 依赖供应方:负责提供依赖对象,类似与实际编码中的工厂类,这个人依赖一台电脑玩游戏,那么就必须有个地方能够提供一台电脑,这个地方就是依赖供应方,顾名思义,就是用于创建以来对象的;
  • 依赖注入器:负责将以来对象注入到以来需求方,在实际代码中是一个接口,编译时 Dagger2 自动生成的就是这个接口的实现类。接着上面的说,这个人是依赖需求方,他需要一台电脑,依赖供应方能够提供一台电脑,可是这两者没有打通啊,电脑没有给到这个人,他还是玩不了游戏啊,因此这个时候就由依赖注入器将这台电脑注入给这个人,他就能够使用这台电脑玩游戏了。

上面已经说得很形象了,大家应该都能理解,不能理解的,可以想象下面的一个场景。
你需要一台电脑打游戏,那么你依赖于电脑,你就是依赖需求方,依赖对象是一台电脑。这台电脑哪里能提供呢?当然是淘宝、京东、实体店了,这些都能提供一台电脑,那么它们都是依赖供应方。但是这中间必须得有个东西把电脑从供应商的仓库送到你手里,你才能用,这就可以理解为将电脑这个依赖对象注入到你手中。什么是依赖注入器呢?在这里例子中,那就是三通一达这些快递公司了。

就是一个简单的购物的流程,只是把依赖注入的概念套进去了而已。下面我们就以这个场景为例,写个 Demo,告诉大家如何使用 Dagger2 这个库。

引入 Dagger2

截止到目前,Dagger2 这个库的最新版本是 2.51.1。引入这个库的方式也很简单,在 build.gradle 中添加如下依赖:

dependencies {implementation 'com.google.dagger:dagger:2.51.1'annotationProcessor 'com.google.dagger:dagger-compiler:2.51.1'
}

大家再引入的时候最好查看一下 Dagger 的官网,引入最新的版本:https://dagger.dev/
在引入依赖并 Sync Project 之后,你会发现项目的依赖会多出来两个库:

编写依赖需求方

先编写一个 Person 类,里面有一个 playGame 的方法,这个方法中要使用 Computer,也就是说,Computer 是 Person 的依赖,我们使其成为一个成员变量:

public class Person {private String name;private Computer computer;public void Person(String name) {this.name = name;    }public void playGame(String gameName) {computer.play(gameName);}
}

以下是 Computer 类,作为依赖对象:

public class Computer {private String name;public Computer(String name) {this.name = name;}public void play(String game) {System.out.println("使用 " + name + " 玩 " + game);}
}

编写依赖供应方

现在,有了依赖需求方,那就要找到依赖提供商提供一台电脑。哪里能提供电脑呢,那就先编写一个淘宝类吧:

@Module
public class TaoBao {private Computer assembleComputer() {         //组装一台电脑Computer computer = new Computer("淘宝的电脑");return computer;}@Providespublic Computer getComputer() {return assembleComputer();}
}

这里注意两个注解 @Module 和 @Provides,这两个注解是 Dagger 提供的。其中 @Module 用于告知 Dagger 这个类是一个依赖提供商,@Provides 用于告知 Dagger 这个依赖提供商里面哪些方法是用于提供依赖对象的。
在这个例子中, TaoBao 是一个依赖供应方,其中 getComputer 用于提供依赖对象,assembleComputer 则是一个普通方法。

编写依赖注入器

有了需求方和供应方,那么就需要将两者链接起来,依赖对象只有从供应方交给需求方,才有意义,这就是依赖注入器的工作。在这个例子中,依赖注入器就是快递了,快递把电脑从淘宝店家送到买家手中。这里我们就先编写一个中通吧:

@Component(modules = TaoBao.class)
public interface ZTOExpress {void deliverTo(Person person);
}

注意这个注入器是一个 interface 而非 class,在编译时,Dagger 会生成对应的实现类。
这个接口添加了一个注解:@Component,这个注解是就是告诉注入器,从哪个依赖供应方拿依赖对象。这段代码里,@Component 注解告知了中通,去淘宝拿电脑快递给买家。
但还有一个问题,中通知道将电脑配送给买家,那配送到那个成员变量呢?Person 里有 name 和 computer,从名字上就能看到电脑肯定要配送到 computer 的成员变量上,这个时候需要将 computer 这个成员变量添加 @Inject 注解:

public class Person {private String name;@Injectprivate Computer computer;//......
}

依赖注入结果

现在三个角色都有了,那我们现在就把它们拼接在一起,看看效果吧。

Person person = new Person("张三");
ZTOExpress ztoExpress = DaggerZTOExpress.builder().taoBao(new TaoBao()).build();
ztoExpress.deliverTo(person);
person.playGame("赛博朋克2077");

输入:

System.out    I  使用 淘宝的电脑 玩 赛博朋克2077

总结

先讲到这里。后续再补全。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Andorid 11 InputDispatcher FocusedApplication设置过程分析

在Input ANR中,有一类ANR打印的reason 为 “xx does not have a focused window” ,表明 输入事件 5s 内,只有FocusedApplication,而没找到focused window。本文分析下FocusedApplication的设置过程。 setFocusedApp 源码路径&am…

iOS 应用内存超过多少会收到系统内存警告 ?

iOS 应用内存超过多少会收到系统内存警告 ? 在 iOS 应用中,系统内存警告的触发是由 iOS 操作系统动态决定的,并不是一个固定的阈值。系统会根据当前设备的可用内存、正在运行的其他应用程序的内存需求以及当前应用程序的内存占用情况来判断是…

用PlantUML可视化显示JSON

概述 PlantUML除了绘制UML中的一些标准图之外,也可以以图形化的方式显示一些其他图形或数据形式的结构,这其中就包括JSON。 它以一种简单且优美的图形形式,表达了JSON的结构。你可以用它来作为设计JSON数据文件的依据,辅助设计或…

day01:项目概述,环境搭建

文章目录 软件开发整体介绍软件开发流程角色分工软件环境 外卖平台项目介绍项目介绍定位功能架构 产品原型技术选型 开发环境搭建整体结构:前后端分离开发前后端混合开发缺点前后端分离开发 前端环境搭建Nginx 后端环境搭建熟悉项目结构使用Git进行版本控制数据库环…

【C++】AVL树(旋转、平衡因子)

🌈个人主页:秦jh_-CSDN博客🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ​ 目录 前言 AVL树的概念 节点 插入 AVL树的旋转 新节点插入较高左子树的左侧---左左:…

【C++】stack和queue的模拟实现 双端队列deque的介绍

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🔥stack的模拟实现🔥queue的模拟实现🔥deque(双端队列)deque的缺陷 🌈为什么选择…

基于Go 1.19的站点模板爬虫

创建一个基于Go 1.19的站点模板爬虫涉及到几个关键步骤:初始化项目,安装必要的包,编写爬虫逻辑,以及处理和存储抓取的数据。下面是一个简单的示例,使用goquery库来解析HTML,并使用net/http来发起HTTP请求。…

【containerd】解决敲击crictl images命令报错问题

【Containerd】解决输入crictl images命令报错问题 文章目录 【Containerd】解决输入crictl images命令报错问题问题复现解决办法验证结果参考链接 问题复现 [rootmaster01 ~]# crictl images WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim…

七、Docker常规软件安装

目录 一、总体步骤 二、安装tomcat 1、docker hub上查找tomcat镜像 三、安装MySQL 1、查看MySQL镜像 2、拉取MySQL镜像到本地,本次拉取MySQL5.7 3、使用MySQL镜像创建容器 4、使用Windows数据库工具,连接MySQL实例 5、常见问题 6、创建MySQL容器实例 7、新…

DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022

DPP能够对目标检测proposal进行非统一处理,根据proposal选择不同复杂度的算子,加速整体推理过程。从实验结果来看,效果非常不错 来源:晓飞的算法工程笔记 公众号 论文: Should All Proposals be Treated Equally in Object Detect…

同声传译app哪个好免费?对话交流推荐这5个

暑期到,也是旅游出行的好日子~自打周边不少国家都开放免签政策之后,出国游也变得更加方便了~对于外语水平不高的朋友来讲,想要保证出行体验,其实手上只要备好一个同声传译app就OK! 倘若你还不清楚都有哪些同声传译app…

背部筋膜炎的症状及治疗

背部筋膜炎,也称为胸背肌筋膜炎,主要是由于劳损或风寒湿邪侵入引起的。其典型症状主要包括: 1、疼痛:背部筋膜一旦出现炎症性病变,会对周围交感神经组织产生刺激作用,从而引起不同程度的疼痛症状。 2、僵…

NAT:地址转换技术

为什么会引入NAT? NAT(网络地址转换)的引入主要是为了解决两个问题 IPv4地址短缺:互联网快速发展,可用的公网IP地址越来越少。网络安全:需要一种方法来保护内部网络不被直接暴露在互联网上。 IPv4 &…

低通滤波以及卡尔曼滤波

先讲解几个低通滤波,低通滤波比卡尔曼滤波简单,因为卡尔曼滤波涉及到两个输入量,一个是控制量,一个是观测量,而低通滤波是一个输入量 1,利用工具箱配置低通滤波 参考地址:https://blog.csdn.net…

SystemUIService启动-Android13

SystemUIService启动-Android13 1、SystemUIService启动2、其他SystemUI services启动2.1 Dagger依赖注入2.2 Recents为例 1、SystemUIService启动 SystemUI启动&#xff0c;及其SystemUIService启动 <!-- SystemUi service component --><string name"config_s…

应用层协议原理——可供应用程序使用的运输服务

前面讲过套接字是应用程序进程和运输层协议之间的接口。在发送端的应用程序将报文推进该套接字。在该套接字的另一侧&#xff0c;运输层协议负责使该报文进入接收进程的套接字。 包括因特网在内的很多网络提供了不止一种运输层协议。当开发一个应用时&#xff0c;必须选择一种可…

什么是海外仓管理自动化?策略及落地实施步骤指南

作为海外仓的管理者&#xff0c;你每天都面临提高海外仓运营效率、降低成本和满足客户需求的问题。海外仓自动化管理技术为这些问题提供了不错的解决思路&#xff0c;不过和任何新技术一样&#xff0c;从策略到落地实施&#xff0c;都有一个对基础逻辑的认识过程。 今天我们整…

重生奇迹mu的地图名

地图之一&#xff1a;勇者大陆 勇者大陆地处奇迹大陆中央。终年阴雨连绵&#xff0c;气候潮湿闷热。植物由充满黑暗阴森气氛的草地所构成。这里的NPC数量是所有地图中最多的。因为地步交通要冲&#xff0c;所以也是玩家聚集最多的地方。 这里是剑士、魔法师、魔剑士和圣导师初…

vue3关于在线考试 实现监考功能 推流拉流

vue3 关于在线考试 实现监考功能&#xff0c; pc端考试 本质是直播推流的功能 使用腾讯云直播: 在线文档 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/f…

永磁同步电机控制算法--最大转矩电流比控制(虚拟信号注入法)

目前&#xff0c;国内外相关学者对 MTPA 控制方法进行了一系列的理论研究与仿真分析。通过研究取得的成果综合来看&#xff0c;该控制方法主要有&#xff1a;直接公式计算法、曲线拟合法、查表法、搜索法、高频信号注入法以及参数辨识法等。 之前的文章中已经介绍了直接公式计…