简单介绍 Dagger2 的入门使用

news2024/9/22 15:43:58

依赖注入

在介绍 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;
    }

    @Provides
    public 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;
    @Inject
    private 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.coloradmin.cn/o/1907882.html

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

相关文章

学习数据库2

在数据库中创建一个表student,用于存储学生信息 查看建表结果 向student表中添加一条新记录 记录中id字段的值为1,name字段的值为"monkey",grade字段的值为98.5 并查看结果 向student表中添加多条新记录 2,"bob"…

Gradle基础:从入门到掌握

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 在现代软件开发中,自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…

Oracle 19c 统一审计表清理

zabbix 收到SYSAUX表空间告警超过90%告警,最后面给出的清理方法只适合ORACLE 统一审计表的清理,传统审计表的清理SYS.AUD$不适合,请注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

2024全球数字经济大会:大模型时代下DataOps驱动企业数智化升级

7月5日,以“开源生态筑基础,数字经济铸未来”为主题的2024全球数字经济大会在北京成功举办,来自全国各地的专家学者、企业代表、数据库行业从业人士及众多开源开发者,共聚一堂,共同探讨开源数据库技术的发展现状与未来…

C++ | Leetcode C++题解之第216题组合总和III

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<vector<int>> res;void backtracking(int k, int n, vector<int> ans){if(k 0 || n < 0){if(k 0 && n 0){res.emplace_back(ans);}return;}int start (ans.size() 0 ?…

c#变量和修饰符

目录 1. 变量的作用域有哪些&#xff1f; 2. 成员变量和静态变量的区别&#xff1f; 3. 利用递归&#xff0c;写个文件目录遍历&#xff0c;打印出文件名、扩展名、文件大小 ​4. 简述访问修饰符有几种&#xff0c;各有什么不同&#xff1f; 5. 重点比较public、protected、…

如何从 Windows 11/10/8.1/8/7 恢复已删除的视频

意外删除了视频或格式化了 SD 卡/硬盘&#xff1f;没有备份已删除的视频&#xff1f;别担心&#xff0c;我们有解决方案来恢复 Windows 11、10 中已删除的视频并处理这种糟糕的情况。 但在了解如何恢复已删除的视频和视频恢复应用程序之前&#xff0c;请知道 Windows 会为您提…

九科bit-Worker RPA 内容学习

简介&#xff1a; 什么是RPA&#xff1f; RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;本质上是一种“AI数字员工”&#xff0c;针对企业中存在的大批量、重复性、机械化人工操作&#xff0c;通过模拟人的工作流程使之实现自动化。 b…

Vulnhub靶场DC-6练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. wordpress扫描2. wordlists字典爆破 0x03 漏洞查找与利用1. 漏洞查找2. CVE-2018-15877漏洞利用3. 反弹shell5. nmap提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-6.zip 介绍&#…

Echarts桑基图

关于Echarts的使用方法参考&#xff1a;vue2中echarts的使用_vue2中使用echarts-CSDN博客 实现效果&#xff1a; 代码&#xff1a; var sysT {"用采": #2D9BFF,"营销系统": #39BFFF,"ERP": #76C2FF,"财务管控": #5F57FC,"PMS&…

用起来超爽的4个宝藏软件工具

记得带 “记得带”是一款专为繁忙的都市人设计的生活服务软件&#xff0c;旨在帮助用户轻松管理日常生活中的各种事务。该应用程序集成了多种实用功能&#xff0c;包括购物清单、待办事项、日程安排和健康追踪等。它还具有智能提醒功能&#xff0c;可以根据用户的日常习惯和偏好…

python特征相关性可视化分析 - sns.pairplot

seaborn 是一个基于 matplotlib 的 Python 数据可视化库&#xff0c;提供了更高层次的接口来绘制有吸引力的统计图形。pairplot 是 seaborn 中的一个函数&#xff0c;用于绘制数据集中多个变量之间的成对关系图。 基本用法 pairplot 函数可以快速地对数据集中的所有数值变量进…

49.实现调试器HOOK机制

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;47.HOOK引擎优化支持CALL与JMP位置做HOOK 以 47.HOOK引擎优化支持CALL与JMP位置做HOOK 它的代码为基础进行修改 效果图&#xff1a;游…

DBA 数据库管理

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

【大模型实操 | LoRA、QLoRA微调大模型实战技巧分享,含常见QA解答!】

文末有福利&#xff01; 引言 今天给大家分享的这篇文章是关于LoRA微调大模型实操技巧&#xff0c;讨论了从实验中得出的主要经验和教训&#xff1b;此外&#xff0c;本文将解答一些与LoRA技术相关的常见问题。如果你对于微调定制化的大语言模型感兴趣&#xff0c;希望这些见…

HTML(28)——空间转换

空间&#xff1a;是从坐标轴角度定义的XYZ三条坐标轴构成了一个立体空间 Z轴位置与视线方向相同 空间转换 平移 属性&#xff1a; transform: translate3d(x,y,z);transform: translateX();transform: translateY();transform: translateZ(); 取值&#xff1a;像素单位数值…

Why Can’t Robots Click The “I’m Not a Robot” Box On Websites?

Clicking a tiny box tells Google all they need to know about your humanity 你好,我是 Jiabcdefh。 if you’ve browsed the internet for any amount of time, you will likely come across a reCAPTCHA box. These boxes appear when you first enter certain websites…

LabVIEW开发高灵敏静电计

开发了一套基于LabVIEW平台的高灵敏静电计控制软件&#xff0c;用于提升闪烁薄膜探测器在中子和伽马射线探测中的灵敏度标定精度。传统的标定方法存在数据准确性不高和操作复杂性高的问题&#xff0c;因此开发这款软件解决这些挑战&#xff0c;通过自动化控制和高效的数据处理&…

删除重复的图片

一、解决&#xff1a;删除重复的图片 最近在用某网盘下载文件时&#xff0c;发现下载的图片文件有重复的&#xff0c;一个图片重复3次下载。严重占用硬盘&#xff0c;下载速度还不快。 原本有1T多的硬盘容量现在还剩300G,只下载了96%&#xff0c;据观察1%的进度大约需要100G的…

Typora篇-忍痛开启

语雀专业会员即将到期, 我看着99元的学费款, 我决定重新用回Typora。 虽然里面有一些文件但是我还是舍不得ಥ_ಥ 99元巨款。 下面开启我的Typora整活历程&#xff0c; 大家有什么好用的插件快捷方式一起来分享啊。