Dagger2使用

  • 在android引入Dagger2库
    //引入Dagger2implementation("com.google.dagger:dagger:2.48.1")annotationProcessor ("com.google.dagger:dagger-compiler:2.48.1")
  • 构造器注入

创建一个类

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

创建注入器

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

初始化注入器

    @Overrideprotected 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();@InjectCar car;

打印log如下

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

   @InjectCar car;@InjectCar car1;@InjectCar car2;

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

  • 有参数构造器注入

这了创建两个类

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

我们直接在MainActivity中注入CarB

 @InjectCarB 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方法进行创建对象@Providespublic 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()//方法传入参数@Providespublic 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);
}

接下来就是调用

@InjectRetrofit retrofit;@InjectApiService apiService;@Overrideprotected 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.mzph.cn/news/202920.shtml

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

相关文章

Java利用UDP实现简单群聊

一、创建新项目 首先新建一个新的项目,并按如下操作 二、实现代码 界面ChatFrame类 package 群聊; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.InetAddress; public abstract class ChatFrame extends JFrame { p…

C语言之多维数组

所谓多维数组就是以多个数组为单位组成的数组,即元素本身是数组的数组。下面我们来学习多维数组的基本知识: 多维数组 上一节学习的数组都是int型或double型等单一类型,实际上数组本身也可以作为组成数组的元素。 以数组作为元素的数组时二…

Java架构师系统架构设计原则应用

目录 1 导语2 如何设计高并发系统:局部并发原则3 如何设计高并发系统:服务化与拆分4 高可用系统有哪些设计原则?5 如何保持简单轻量的架构-DRY、KISS,YAGNI原则6 如何设计组件间的交互和行为-HCLC,CQS,SOC7 框架层面的发展趋势-约定大于配置想学习架构师构建流程请跳转:…

【数据结构】动态规划(Dynamic Programming)

一.动态规划(DP)的定义: 求解决策过程(decision process)最优化的数学方法。 将多阶段决策过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。 二.动态规划的基本思想: …

【vue】点击导航菜单切换局部页面,打开展示默认栏目,页面刷新等问题

非专业前端,局限性较高,有些问题看起来很小,但是初次接触很棘手,需要查找很多博客,内容也很杂。以下只是过程中总结下来的,要解决的就是标题中的三个问题。 这是我需要达成的效果。 1.第一个是进入导航菜单…

浅谈web性能测试

什么是性能测试? web性能应该注意些什么? 性能测试,简而言之就是模仿用户对一个系统进行大批量的操作,得出系统各项性能指标和性能瓶颈,并从中发现存在的问题,通过多方协助调优的过程。而web端的性能测试…

Clion运行QT,模拟VS弹出CMD框打印

参考:https://stackoverflow.com/questions/35385772/running-clion-on-the-system-console-like-visual-studio 在运行配置的地方进行编辑: 可执行文件设置:C:\Windows\System32\cmd.exe程序实参:/c “start cmd.exe cmd /c “…

【开发板测评】一起玩转ACM32G103开发板,释放MCU无限潜能!

为帮助小伙伴们更好的快速熟悉了解ACM32G103系列的特性,航芯特别发起了该系列开发板评测试用,以帮助大家更好地运用MCU进行项目设计。 ACM32G103开发板介绍 ACM32G103系列是航芯推出的一款有着丰富模拟外设及安全存储扩展能力的高性价比通用MCU。 高性…

汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展

可能很多人都不知道,危化品爆炸、城市光化学烟雾污染(如英国伦敦烟雾事件)、城市灰霾、温室效应、臭氧层空洞等问题背后的元凶都是VOC。VOC(Volatile Organic Compounds)即挥发性有机物,这类物质易挥发,且普遍具有毒性…

系统调用过程

应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由…

[实践总结] Java中读取properties配置文件

读取此key.properties文件 代码实现 import java.io.IOException; import java.io.InputStream; import java.util.Properties;public class PropertyUtils {private static final Properties properties new Properties();static {try (InputStream resourceAsStream Prope…

云上守沪 | 云轴科技ZStack成功实践精选(上海)

为打造国际数字之都,上海发布数字经济发展“十四五”规划,围绕数字新产业、数据新要素、数字新基建、智能新终端等重点领域,加强数据、技术、企业、空间载体等关键要素协同联动,加快进行数字经济发展布局;加快基础软件…

JavaWeb(五)

一、JDBC概述 JDBC 就是使用Java语言操作关系型数据库的一套API 全称是Java DataBase Connectivity 表示Java数据库连接。 JDBC的本质是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商去实现这套接口&#xff0…

【zotero】搭配onedrive同步设置

1 登陆自己账户 登陆后记得取消文件同步的两个勾勾,不然后期会很占用储存空间的。 设置同步文件夹 一定要精准定位到绿色框框里头的文件夹。

【动手学深度学习】(十一)卷积层

文章目录 一、从全连接到卷积 一、从全连接到卷积 分类猫和狗的图片 使用一个相机采集图片(12M像素)RGB图片有36M元素使用100大小的单隐层MLP,模型有3.6B元素 远多于世界上所有猫和狗总数(900M狗,600M猫)…

制作一个RISC-V的操作系统五-RISC-V汇编语言编程一

文章目录 RISC-V汇编语言入门汇编语言概念简介 汇编语言语法介绍(GNU版本) RISC-V汇编语言入门 汇编语言概念简介 高级:可以理解就是更贴近人的理解 低级:可以理解就是更贴近机器的 难移植:汇编指令基本上和机器指令…

Matlab之统计数据分布并绘制直方图函数histogram

一、功能 直方图是一种将数据分组到条柱中的条形图。该函数可以统计数据在划分区间内的数量分布,同时以直方图的形式展示统计结果。 二、语法 1、histogram(X) 创建直方图X的图。该函数使用 一种自动分箱算法,返回具有统一宽度…

软件科技成果鉴定测试需提供哪些材料?

为了有效评估科技成果的质量,促进科技理论向实际应用转化,所以需要进行科技成果鉴定测试。申请鉴定的科技成果范围是指列入国家和省、自治区、直辖市以及国务院有关部门科技计划内的应用技术成果,以及少数科技计划外的重大应用技术成果。   …

“山东工行杯”山东省第五届数据应用创新创业大赛颁奖仪式丨2023中国新型智慧城市发展创新峰会“数字经济”分论坛同台举行

「场景赋能 数创齐鲁」 山东省第五届数据应用创新创业大赛 精彩颁奖典礼引领科技潮流 11月24日,“山东工行杯”山东省第五届数据应用创新创业大赛颁奖仪式与2023中国新型智慧城市发展创新峰会相结合并在“数字经济”分论坛同台举行。 本次大赛以“场景赋能&#…

VA03 凭证流 查看备忘

今天被问到了,为什么这个销售订单 只显示了3 EA 仔细看了一下,前面10 是行项目 看销售订单 最后发现,凭证流跟选择查看的行项目有关系 以前一直没有关注这个细节