Dagger2使用

news2025/1/21 12:17:09
  • 在android引入Dagger2库
    //引入Dagger2
    implementation("com.google.dagger:dagger:2.48.1")
    annotationProcessor ("com.google.dagger:dagger-compiler:2.48.1")
  • 构造器注入

创建一个类

public class Car {
    //在构造器上面添加dagger的@Inject即可
    @Inject
    public Car() {
        Log.e("car", "new Car " + this);
    }

}

创建注入器

//调用dagger的@Component注解
@Component
public interface MainComponent {
    //哪个个类需要注入,这里是MainActivity需要注入含有@Inject的类
    void inject(MainActivity mainActivity);
}

初始化注入器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("MainActivity", "new onCreate");
        //dagger会自动生成一个Dagger+创建的接口名称的类,初始化注入器
        DaggerMainComponent.create().inject(this);

    }

开始注入对象

    //定义需要被注入的实例,在变量中定义注解@Injet即可,这样就会创建一个实例
    //这里相当于DaggerMainComponent.create().inject(this);car=new Car();
    @Inject
    Car car;

打印log如下

多次调用会注入多个不同对象,想到于创建了多个不同对象

   @Inject
    Car car;
    @Inject
    Car car1;
    @Inject
    Car car2;

打印log如下,创建了多个对象

  • 有参数构造器注入

这了创建两个类

public class CarA {
    private Car car;

    @Inject
    public CarA(Car car) {
        this.car = car;
        Log.e("car", "new CarA " + this);
    }
}
public class CarB {
   private Car car;
   private CarA carA;

    @Inject
    public CarB(CarA carA,Car car) {
        this.car = car;
        this.carA = carA;
        Log.e("car","new CarB "+this);
    }
}

我们直接在MainActivity中注入CarB

 @Inject
 CarB carB;

猜猜会创建多少个对象

结果如下

现在理一下思路

@Inject
CarB carB;

相当于

CarB carB=new CarB(CarA carA,Car car)

这两个参数是怎么来的呢,我们在CarA的构造器上面有@Inject,这边代码会帮我们进行创建CarA,进一步代码会变成如下

CarB carB=CarB(new CarA(Car car) ,Car car) ;

Car 又是哪里来的呢,我们在Car的构造器上有@Inject,代码会帮我们创建对应对象,所以进一步为

CarB carB=CarB(new CarA(new Car()) ,new Car()) ;

所以打印是上面那个流程

  • 无法在构造器上使用@Injet创建方法

我们在不是自己创建的类上无法在构造器上进行@Injec注解,那该怎么使用了,dagger提供了另一个注解方式@Module+@Provides实现,下面以Retrofit创建为例

引入Retrofit

 val retrofit2 = "2.9.0"
 implementation("com.squareup.retrofit2:retrofit:$retrofit2")

创建如下

创建Retrofit的接口类
public interface ApiService {
}

第一个步:Dagger提供实例化Module

//使用@Module,表示这个类是个Dagger的Module,同时我们需要把这个类载入带有@Component注解的接口中
@Module
public class NetMoudle {
    //外部引用的类无法在构造方法上增加@Inject,通过@Privides方法进行创建对象
    @Provides
    public Retrofit provideRetrofit() {
        Retrofit retrofit = new Retrofit.Builder().baseUrl("http://www.baidu.com").build();
        Log.e("NetModule", "new Retrofit" + retrofit);
        return retrofit;
    }

    //通过参数传入在Module中创建的值,这里代码执行相当于provideApiService(provideRetrofit()),调用了provideRetrofit()
    //方法传入参数
    @Provides
    public ApiService provideApiService(Retrofit retrofit) {
        ApiService apiService = retrofit.create(ApiService.class);
        Log.e("NetModule", "new ApiService  retrofit " + retrofit);
        Log.e("NetModule", "new ApiService " + apiService);
        return apiService;
    }
}

第二步:装载
//调用dagger的@Component注解,这个里面可以创建多个注解
@Component(modules = {NetMoudle.class})
public interface MainComponent {
    //哪个个类需要注入,这里是MainActivity需要注入含有@Inject的类
    void inject(MainActivity mainActivity);
}

接下来就是调用


    @Inject
    Retrofit retrofit;
    @Inject
    ApiService apiService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("MainActivity", "new onCreate");
        //dagger会自动生成一个Dagger+创建的接口名称的类,初始化注入器
        DaggerMainComponent.create().inject(this);

    }

再猜猜会是什么打印呢

再次来看看是什么创建逻辑

首先

@Inject
Retrofit retrofit;

相当于代码自动调用了

NetMoudle().provideRetrofit()

所以这里打印了一个实例化Retrofit,会打印第二行

紧接着

@Inject
ApiService apiService;

相当于

NetMoudle().provideApiService(NetMoudle().provideRetrofit())

这里会打印后面的log。在provideApiService方法中获取到的Retrofit是从provideRetrofit()获取到的,两个Retrofit的地址相同。

这里发现不管是从@Inject注解到构造器上,还是通过@Privodes注解方法实现实例化类,都会创建多个对象,但是在项目中,有些类需要用到单利模式,那该怎么办呢,接下来就要用到Dagger2的作用域了,下面是作用域的讲解

  • 局部作用域

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

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

相关文章

现代雷达车载应用——第2章 汽车雷达系统原理 2.1节

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.1 基本雷达功能 雷达系统通过天线或天线阵列向空间辐射电磁能量。辐射的电磁能量“照亮”周围的目标。“被照亮”的目标拦截一些辐射能量&#xff0…

二十章总结

20.1线程介绍 世间有很多工作都是可以同时完成的。例如,人体可以同时进行呼吸、血液循环、思考问题等活动;用户既可以使用计算机听歌,也可以使用它打印文件。同样,计算机完全可以将多种活动同时进行,这种思想放在 Jav…

配置主机与外网时间服务器同步时间

目录 NTP服务简介 时间管理命令 第一步:更改当前主机所在地的时间 方法一:使用tzselect命令查询需要的时区 1、使用tzselect命令查询需要的时区 2、添加变量到 ~/.bash_profile 文件中,即追加类似的内容: 3、重新连接一个…

Flink(九)【时间语义与水位线】

前言 2023-12-02-20:05,终于写完啦,最近状态不错。刚写完又收到了她的消息哈哈哈哈,开心。 再去全力打拼一次,奋战一场,就算最后打了败仗也无所谓,至少你留下了足迹。 《解忧杂货店》 1、时间语义 …

团队git操作流程

项目的开发要求:(1)项目组厉员代码提交不少于20次 (2)项目组厉员每天提交不少于20次 (3)企业项目开发代码的每天的提交一般提交3-5次 (4)代码仓库的管理 git的基础操作流…

【CSP】202305-1_重复局面Python实现

文章目录 [toc]试题编号试题名称时间限制内存限制题目背景问题描述输入格式输出格式样例输入样例输出样例说明子任务提示Python实现 试题编号 202305-1 试题名称 重复局面 时间限制 1.0s 内存限制 512.0MB 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3…

会声会影2024软件还包含了视频教学以及模板素材

会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能,用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材,让用户剪辑视频更加的轻松。 会…

【Linux 进度条小程序】缓冲区+回车换行

文章目录 回车与换行缓冲区举个栗子fflush函数倒计时小程序进度条小程序 回车与换行 回车和换行是不同的两个概念 回车:\r 使光标回到本行行首。 换行:\n使光标下移一格。 一般我们的键盘上的Enter键是回加换行键 在c语言中 \n 表示回车换行 效果和Ent…

iNet Network Scanner for Mac:简洁高效的WiFi网络扫描软件

随着无线网络的普及,WiFi网络已经成为我们日常生活中必不可少的一部分。无线网络的稳定性和速度对我们的工作和娱乐体验至关重要。因此,一款功能强大、简洁高效的WiFi网络扫描软件非常重要。今天,我们向大家推荐一款优秀的Mac平台WiFi网络扫描…

AI生成工具助力业界,黎万强投资。/微信支付和支付宝境外银行卡全面支持 | 魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件🔥,更新AIGC的最新动态,生成相应的魔法简报,节省阅读时间👻 🔥资讯预览 AI应用一年半,IBM HR部省12000小时 华为沉默中,何时…

提高工厂能源效率的关键:工厂能耗监测平台

工业做为能源消耗的重要场所,所以节能减排对工业来讲是一个亟需解决的问题。除了对设备进行更新换代外,还需要能源管理消耗监测平台,帮助企业实现节能减排的目标。 工厂能源消费量非常庞大,能源比较难以监测与控制。传统能源的管…

《微信小程序开发从入门到实战》学习四十二

4.3 云开发文件存储 文件存储功能支持将任意数量和格式的文件(如图片和视频)保存在云端,支持 以文件夹的形式将文件归类。 在云开发控制台中,可以对云端保存的文件进行管理。 也可以通过文件存储API对文件进行上传、删除、移动…

每日股票价格 - 华为机试真题题解

每日股票价格 - 华为机试真题题解 题目描述 ​ 给定某只股票连续N天的价格列表stockPrices,其中stockPricesi表示股票某天的价格,请生成一个新列表,对应位置输出为:要想等到股票价格上涨,至少需要等待的天数,如果股票…

一个容器中填值,值太多不换行,而是调小字体大小和行高

<!-- clampLineHeight 重计算行高 --> <!-- clampTextSize 重计算字体大小 --> <!-- 这里的div高8mm, 宽6cm, 文本为text --> <div style"height:8mm;width:6cm;text-align:left"><span :style"{ fontSize: clampTextSize(text, 6cm…

Redis——某马点评day03——part2:秒杀业务异步优化

异步秒杀思路 原本的流程是如下所示&#xff0c;必须从开始到创建订单成功才会返回响应。就像饭店里面从下单到上菜都是一个人在服务&#xff0c;就导致服务员利用率很低&#xff0c;后一个顾客要等到前一个顾客上完菜才可以下单。 最简单的优化就是加员工&#xff0c;一次性…

基于单片机自动饮料混合机控制系统设计

**单片机设计介绍&#xff0c;基于单片机自动饮料混合机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机自动饮料混合机控制系统设计是一个涉及多个领域的复杂项目&#xff0c;包括单片机技术、传感器技术…

开发者的福音:TinyVue 组件库文档大优化!类型更详细,描述更清晰!

你好&#xff0c;我是 Kagol。 前言 从今年2月份开源以来&#xff0c;有不少朋友给我们 TinyVue 组件库提了文档优化的建议&#xff0c;这些建议都非常中肯&#xff0c;我们也在持续对文档进行优化&#xff0c;并且从中总结出了大家对于文档优化的一些共性问题&#xff0c;形…

redis应用-分布式锁

目录 什么是分布式锁 分布式锁的基本实现 引入过期时间 引入校验id 引入lua 引入看门狗 引入redlock算法 什么是分布式锁 在一个分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于"线程安全"的问题. 而…

Vis.js教程(三):设置关系图的节点关系指向

1、引言 在 Vis.js教程&#xff08;一&#xff09;基础关系图中&#xff0c;我们介绍了基础关系图的创建&#xff0c;以及关系图的简单样式修改。 这一节我们介绍如何给关系图添加节点之间的关系指向。 2、关系指向添加 // create an array with edgesconst edges new vis…

线上项目修改最后一招 修改jar中的文件并重新打包成jar

解压jar包 在要操作的jar文件上边cmd打开命令提示符窗口&#xff08;windows系统&#xff09;&#xff0c; 在cmd命令下执行 jar -xvf xxx.jar 解压jar包&#xff08;其中xxx.jar换成你的jar包名&#xff09; jar -xvf admin-1.0.0.jar 替换或者更改操作 如果要替换jar压缩…