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

    @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.mfbz.cn/a/783827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我们所熟知的meme梗图也可以用AI生成了,老外都玩坏了。

meme梗图不知道大家看到过嘛?相信你们看见下面的图你就会大叫“卧槽”,原来是这种图,我以前经常狂刷不止,太有趣了。 其实meme是一个网络流行语,可译为模因。在大众非学术范围内也可翻译为我们所熟知的“梗”。其中“表…

Function Call ReACT,Agent应用落地的加速器_qwen的function calling和react有什么不同

探索智能体Agent的未来之路:Function Call与ReACT框架的较量,谁能引领未来? 引言 各大平台出现智能体应用创建,智能体逐渐落地,背后的使用哪种框架? 随着各大平台,例如百度千帆APPbuilder、阿…

分类下两列一组统计

表格 A 列是分类,后面是 2N 个 key-value 列 ABCDEFG1CountryLabel1Count1Label2Count2Label3Count32USA10B9C83USD9C8A74USC8D7B65USA7C6B56CAA10B9C87CAD9C8A78CAC8D7B69INA10C9B810IND9A8B711INA8D7B6 需要对分类、key 分组,对 value 求和&#xff…

一文揭秘:中小企业选择做软文营销推广的优势有哪些?

在当今这个信息泛滥、注意力稀缺的时代,中小企业作为经济活力的重要组成部分,面临着前所未有的机遇与挑战。而相比于硬广告的直接灌输,软文营销推广以其独特的魅力,成为了中小企业提升品牌形象、吸引目标客户的重要手段。今天投媒…

tqdm进度条函数使用 python

1.作用: 通过使用 tqdm ,可以让您在处理大量数据或长时间运行的循环时,更好地了解程序的执行进度,增强用户体验。 2.使用 ---可以使用 pip install tqdm 进行安装。 ---tqdm.tqdm(iterator可迭代对象,desc描述符&…

Linux下QT程序启动失败问题排查方法

文章目录 0.问题背景1.程序启动失败常见原因2.排查依赖库问题2.1 依赖库缺失2.2 依赖库加载路径错误2.3 依赖库版本不匹配2.4 QT插件库缺失2.4.1 QT插件库缺失2.4.2 插件库自身的依赖库缺失 2.5 系统基础C库不匹配 3.资源问题3.1 缺少翻译文件3.2 缺少依赖的资源文件3.3 缺少依…

视频融合共享平台LntonCVS视频监控汇聚平台工业视频监控系统

LntonCVS是一款功能强大、灵活部署的安防视频监控平台,具备广泛的扩展性和视频能力。它支持多种主流标准协议,如国标GB28181、RTSP/Onvif、RTMP,同时还能兼容厂家的私有协议和SDK,如海康Ehome、海大宇等。除了传统的安防监控功能外…

基于51单片机的四路抢答器Protues仿真设计

一、设计背景 近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于51单片机的八路抢答器设计。本设计中,51单片机充当了核心控制器的角色,通过IO口与各个功能模块相连接。按键模块负责检测参与者的抢答动作&#xff0c…

ExcelVBA运用Excel的【条件格式】(二)

ExcelVBA运用Excel的【条件格式】(二) 前面知识点回顾 1. 访问 FormatConditions 集合 Range.FormatConditions 2. 添加条件格式 FormatConditions.Add 方法 语法 表达式。添加 (类型、 运算符、 Expression1、 Expression2) 3. 修改或删除条件…

【数据结构】线性表----栈详解

栈 栈(Stack)是一种常见的数据结构,它具有**后进先出(Last In, First Out, LIFO)**的特点。栈的运作类似于物理世界中的叠盘子:最新放上去的盘子最先被拿走,而最底部的盘子最后才能被取出。 如…

企业文档加密软件推荐丨2024企业用什么加密软件

在数字化时代,信息安全已经成为企业和个人不可忽视的问题。文档加密软件作为一种保护敏感信息不被非法访问或篡改的有效工具,其重要性日益凸显。通过加密技术,可以确保文档内容在传输和存储过程中的安全性,防止数据泄露和未经授权…

谷粒商城学习笔记-使用renren-fast-vue框架时安装依赖包遇到的问题及解决策略

文章目录 1,npm error Class extends value undefined is not a constuctor or null2,npm warn cli npm v10.8.1 does not support Node.js v16.20.2.3,npm error code CERT_HAS_EXPIRED学习心得 这篇文章记录下使用renren-fast-vue&#xff…

Spring Boot:连接MySQL错误Public Key Retrieval is not allowed

环境: MySQL版本:8.0.17 SpringBoot版本:2.5.15 解决 解决方式很简单,在数据库配置连接字符串spring.datasource.url末尾添加&allowPublicKeyRetrievaltrue即可,如下图: 重新启动,恢复正常…

Ai Native应用开发(一)--数字人

背景 刚参加完24年世界人工智能大会(WAIC),聊聊自己的一些感受。这次会明显比去年多很多人,用人山人海来形容应该也不为过。根据我自己粗浅观察参会的人员也比去年更多样化。去年更多还是从业者或者是这块研究人员。今年每个论坛…

Pytorch实战(二):VGG神经网络

文章目录 一、诞生背景二、VGG网络结构2.1VGG块2.2网络运行流程2.3总结 三、实战3.1搭建模型3.2模型训练3.3训练结果可视化3.4模型参数初始化 一、诞生背景 从网络结构中可看出,所有版本VGG均全部使用33大小、步长为1的小卷积核,33卷积核同时也是最小的能…

Linux网络配置管理

目录 一、网络配置 1. 网卡配置 2. 路由 二、 网络信息查看 1.netstat 2. ss 三、 额外的命令 time 一、网络配置 之前我们学过 ifconfig ,这个命令可以查看网络接口的地址配置信息,我们只知道它可以查看接口名称、IP 地址、子网掩码等。 但是&a…

java —— tomcat 部署项目

一、通过 war 包部署 1、将项目导出为 war 包; 2、将 war 包放置在 tomcat 目录下的 webapps 文件夹下,该 war 包稍时便自动解析为项目文件夹; 3、启动 tomcat 的 /bin 目录下的 startup.bat 文件,此时即可从浏览器访问项目首页…

windows 11 + kali wsl二合一配置步骤与踩坑

windows 11 kali wsl二合一配置步骤与踩坑 在前几天的某市攻防演练中,在攻防前期,我的虚拟机经常无缘无故出现断网、卡顿等现象,但找不出原因。 为了不影响后续的这些天的攻防演练,我选择在一个晚上通宵 在我的windows 11系统上…

2.作业2

目录 1.作业题目 A图 B代码 2.css盒子模型 0.css盒子模型 1.外边距(margin) 2.边框(border) 3.内边距(padding) ​编辑 3.GET方法与POST方法的区别 学习产出: html的作业 1.作业题目 A图…