Dagger2中可以很方便的实现单例,但注意这个单例是一个Component作用域范围内的单例,而这个范围,需要上层定义@Scope注解。默认可以使用@Singleton注解,也可以使用自定义其他名称的注解,自定义时参照@Singleton即可,例如@Abc都没有问题,该注解没有特殊作用,只是起标记作用,因此命名与范围相符合更好。

例如可以取如下范围单例:

1.@ApplicationSingleton:进程级别单例

2.@ActivitySingleton:页面级别的单例

单例实现步骤

Dagger2实现单例分2步:

给对应的Component添加范围注解

例如CoffeeShopComponent使用自定的范围注解@ActivitySingleton,代码如下:

@Subcomponent(modules = {SubModule.class})

@ActivitySingleton

public interface CoffeeShopComponent {

@Subcomponent.Builder

interface Builder {

CoffeeShopComponent build();

}

void inject(Street street);

}

给该Component依赖的Module中提供的对象方法加上该范围注解。

例如期望Logger是单例的,则在Logger的providers方法上,增加和Component或父Component一样的范围注解,表示在Component或父Component实例内是单例的。

@Module

public class SubModule {

@ActivitySingleton

@Provides

public Logger providerLogger(Retrofit retrofit) {

return new Logger(retrofit);

}

}

自动注入的对象,直接在类上设置@Scope类型注解,即可设置单例范围,例如:

@ActivitySingleton

public class TestData {

@Inject

public TestData() {

System.out.println("abc");

}

}

注意

如果注入的对象的Scope范围与Component以及父Component的范围都不符合,则会报错:(unscoped) may not reference scoped bindings

如何实现Activity内单例

Activity内单例也就是同一个Activity内部的注入对象,是同一个。因此需要以下2步:

将Activity内部的Component保持只有1个实例,且与其他Activity中的Component为不同的实例

将注入对象设置的@Scope类型注解与Component一致

android dagger2 单例,Dagger2进阶-单例相关推荐

  1. Java---设计模块(单例的变形)(多例)

    设计模式1--单例变形(多例) ★ 缓存在单例中的使用 缓存在编程中使用很频繁,有着非常重要的作用,它能够帮助程序实现以空间换取时间,通常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放 ...

  2. c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...

    单例模式,多线程单例,双重锁定单例,工厂单例创建上下文. 单例子模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个 ...

  3. Spring容器中 singleton 单例、 prototype多例

    项目开发中通常会使用:singleton 单例. prototype多例 Singleton: 在一个spring容器中,对象只有一个实例.(默认值) Prototype: 在一个spring容器中, ...

  4. scala什么是单例对象_Scala单例和伴侣对象

    scala什么是单例对象 Scala中的单例对象 (Singleton objects in Scala) Scala being an object-oriented programming lan ...

  5. Unity3D C# 单例属性和单例模板及优缺点

    1.什么是单例模式 相信我们都遇到过这样的问题: 我们使用new创建对象,这个对象需要全局共享只用这一个 我们需要用一种简单的方式全局能访问一个类创建的唯一对象 总结下来,我们经常需要创建一个类的单例 ...

  6. Android 依赖注入框架 Dagger2使用

    前言 Dagger 2这个匕首确实很难上手,上手后又比较难瞬间掌握,可以这么说,刚开始使用就是用来尝(zhuang)鲜(X)的,但相信随着使用的加深,会不断体会到它对于整个项目架构的极强辅助作用,能使 ...

  7. 将Android进行到底之Dagger2(一)

    系列文章目录 将Android进行到底之Dagger2(二) 将Android进行到底之Dagger2(三) 文章目录 系列文章目录 前言 一.什么是依赖注入? 二.IOC与Dagger2 1.IOC ...

  8. android 自定义表单,Android实现Ant Design 自定义表单组件

    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...

  9. Android清理设备内存具体完整演示样例(二)

    版权声明: https://blog.csdn.net/lfdfhl/article/details/27672913 MainActivity例如以下: package cc.c;import ja ...

  10. Android 收银机Wifi 连接厨房厨单打印机

    Android 收银机Wifi 连接厨房厨单打印机 说明 第一次集成热敏打印机,对此相关知识为零,以快速接入为目的. 这里主要记录说明在集成过程中遇到的问题以及排查解决的办法.完整可用Android ...

最新文章

  1. 了解EOS看这一篇就够了一、团队二、技术三、项目进度四、争议和风险五、展望
  2. 3000 字详解 Pandas 数据查询,建议收藏
  3. 为什么黑客用python-为什么大多数黑客都使用Python!
  4. 如何去除C#Strings中的空格?
  5. Vijos P1067Warcraft III 守望者的烦恼
  6. c++ 绘制函数图像_图像轮廓和分水岭算法
  7. mysql 结构体_mysql模块使用结构体生成数据库表,不识别long类型
  8. substr 与 substring 的区别
  9. oracle将日期格式化to_char及字符串转日期to_date
  10. POJ - 2533(动态规划 —— 最长子序列)
  11. html5一个可拖动的图片大小,HTML5画布中的可拖动和可调整大小元素
  12. 对人工智能的初步认识
  13. 仿QQ登录界面UI设计
  14. r语言 支持向量机实现_支持向量机解密:R中的实现
  15. 你真的会开会吗?开会无用说
  16. CAD镜像一个实体对象
  17. Parallels Desktop 安装Win 10提示“安全启动功能防止操作系统启动”该怎么解决?
  18. 计算机个性化桌面,良好的个性化桌面图标管理软件排行榜
  19. C语言中 %md 的输入输出使用(还有printf函数的 %0格式控制符的使用)
  20. hive sql 实现姓名手机号证件号脱敏

热门文章

  1. 初见Autorun病毒与解决办法
  2. 如何用两个栈模拟实现一个队列
  3. 【搜素算法02】—回溯法
  4. AUTOSAR和OSEK关系及网络管理比较
  5. 决定要收藏,让你白嫖阿里矢量图(iconfont矢量图使用)
  6. 汇川机器人视觉标定_汇川机器人应用技术课件(1).ppt
  7. 电脑自带蓝牙与HC-06蓝牙模块使用串口助手通信
  8. Java开发快递物流项目(1)
  9. 宽度学习(BLS)实战——python复刻MNIST数据集的数据预处理及训练过程
  10. ubuntu下adb的使用以及开启黑域