Dagger2进阶-范围的控制(Scope和Singleton)

Unity依赖注入框架Reflex:从设计思想到实现详解 依赖注入(DI)是一种重要的软件设计模式,通过将依赖关系的创建与使用分离,实现控制反转(IoC),从而降低代码耦合度、提升可测试性和模块化程度。其核心原理是外部容器负责创建和注入对象所需的依赖,而非对象内部自行创建。在游戏开发领域,这一技术价值尤为突出,能够有效管理复杂对象依赖关系、优化项目架构。Unity引擎作为主流的游戏开发平台,其基于组件的设计模式与独特的生命周期管理,使得通用DI容器往往难以直接适配。因此,专为Unity定制的DI框架成为解决模块间紧耦合、提升大型项目可维护性的关键工程实践。本文以R 阅读详情

前言

        Dagger2的介绍和配置

        Dagger2基础的使用

        Dagger2进阶-编译生成源码解读

        Dagger2进阶-范围的控制(Scope和Singleton)

        Dagger2进阶-Scope的源码探究

        项目源码传送门​​​​​​​

注解解释

    @Singleton:确定生成的类为单列,也就是确定对象的活动时间,属于全局单例,作用在使用@Provides方法上,也要配置到@Component中。

    @Scope:范围,在Dagger2中应用就是确定对象的生命周期,也就是确定对象的存活范围。是一个局部变量的注释,其活动范围在注释修饰的@Component内。

使用Singleton创建一个全局单例

 

我们的需求变成需要一个单列的对象的时候,我们如何做呢?

    我们先来看看没有做任何范围限定的范围操作的时候,是怎样的:

可以看到 两个Goods的地址引用是不一致的,说明对象的创建默认不是单列的,我们修改一下代码,商品类Goods由@Module提供并使用@Singleton修改,@Singleton修饰了@Provides提供的方法后,也要修改Component:

运行后,结果如下:

我们能看到,对象实现了单例了,@Singleton注解为生成了一个单例的对象,然而,真的是这样子吗?

我们建一下第二个Activity,然后新建一个新的组件,TwoComponent:

运行。。。 期待中  

然鹅,oh  my god 不是说好的单例吗,怎么引用地址变了。我们看看@Singleton的源码:

@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}

源码中我们知道@Singleton是使用了@Scopen的注释,其原理跟@Scope一样,所以其不是完全单例的,其确定的范围只是限定在其组件呢?后来我们会通过源码分析为什么会这样,接下来我们重头开始实现一个全应用的单例对象:

建立一个APP级别的Moduele和Component:

@Module
public class AppModule {

    @Singleton
    @Provides
    Goods providesGoods(){
        return new Goods();
    }
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(MyApplication myApplication);
    
    //告诉依赖的Component,我给你提供了这个类。比不可少。
    Goods getGoods();
}

然后我们下面进行修改Activity的组件:

@ActivityScope
@Component(modules = ObjectModule.class,dependencies = AppComponent.class)
public interface MainActivityComponet {

    void inject(MainActivity activity);
}
@ActivityScope
@Component(modules = ObjectModule.class,dependencies = AppComponent.class)
public interface TwoComponent {
    void inject(TwoActivity twoActivity);
}

两个都是使用dependencies 依赖一个父组件,并且设置一个@ActivityScope范围注解,不设置注解会报错,

@Scope
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

 

 

因为需要依赖了组件,在MainActivity和TwoActivity中我们要告诉框架我们依赖的组件是什么

 

 

编译结果:

妥妥的全局单例完成。

 

使用@Scope创建一个局部单例

我想这个就不用我贴代码了。。其实@Singleton也是一个@Scope注解,只是框架给我们设定了一个而已,所以将@Singleton改成@ActivityScope我们就不会在错误的理解下建造一个局部单例。至于为什么范围是基于组件的范围的,我们可以这样理解,每个组件都是一个对象池,@Scope只是保持其在单个对象池唯一而已,具体源码分析会在后面更新。

 

常见问题:

 

1.当方法@Provides确定了Scoped时,组件Component没有设置Scoped:Error:(17, 1) 错误: com.lyc.love.dagger2demo.dagger2.component.MainActivityComponet (unscoped) may not reference scoped bindings:@Singleton@Providescom.google.gson.Gson com.lyc.love.dagger2demo.dagger2.module.ObjectModule.provideGson()

2. 需要为依赖了用@Singleton修饰的组件,也提供一个@Scope:Error:(17, 1) 错误: This @Singleton component cannot depend on scoped components:

@Singleton com.lyc.love.dagger2demo.dagger2.component.AppComponent

3.Error:(18, 10) 错误: com.lyc.love.dagger2demo.bean.Goods cannot be provided without an @Inject constructor or 

这个错误有以下原因:

    @1、如果是依赖的Component提供的类,查询Component的Module是否有@Provided修饰。

    @2、如果是依赖的Component提供的类不存在上面的情况查询是否在Component向外提供了一个方法。比如:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(MyApplication myApplication);

    //告诉依赖的Component,我给你提供了这个类。比不可少。
    Goods getGoods();
}

    @3.查看需要类的中的Module.是否修饰@Provided

 

 

 

 

 

OpenClaw 快速安装与本地应用实战 —— 每一步都有截图加详细说明,本地AI助手,让打工人也有下属 《OpenClaw 2026开源智能体框架10分钟快速部署指南》摘要:本文提供OpenClaw最新版全平台部署方案,重点解决三大核心问题:1)环境配置优化,通过一键脚本实现3-8分钟快速安装(含国内镜像加速方案);2)初始化配置详解,包含大模型绑定(智普AI/本地模型)与5个高频技能安装;3)实战演示文件自动整理任务。同时总结6类常见故障解决方案,涵盖权限、端口占用等典型问题,确保用户从安装到首个自动化任务落地全程无障碍。特别强调Windows需管理员权限、禁用中文路径等关键注意事项,实现"安装即 阅读详情

相关推荐

【CSP-J/S】复赛注意事项 上机文件组织形式

每年/S 复赛都有很多同学因为一些小失误导致一年的努力付之东流。Tony老师整理了一些复赛容易踩坑的点,或许对你有帮助!

星卯教育-信奥教练tony 1万+

Dagger 2 系列(五) -- 进阶篇:@Scope 和 @Singleton

该系列博客的最终目标: 搭建 MVP + Dagger2 框架 该系列博客包含以下几篇内容: Dagger 2 系列(一) -- 前奏篇:依赖注入的基本介绍 Dagger 2 系列(二) -- 基础篇:@Inject、@Component Dagger 2 系列(三) -- 基础篇:@Module 和@Provides Dagger 2 系列(四) -- 基础篇:@Named 和 @Q...

weixin_34255055的博客 226

Mplus实战:三变量随机截距交叉滞后模型(RI-CLPM)语法详解与扩展

本文详细解析了Mplus中三变量随机截距交叉滞后模型(RI-CLPM)的构建原理与语法实现。通过将变量分解为稳定的个体间差异与动态的个体内波动,模型能更纯净地揭示多变量间的纵向交互影响。文章以工作压力、睡眠质量与工作满意度为例,提供了完整的语法模板、关键参数设置(如NOCOV命令、残差相关)及结果解读指南,帮助研究者避开常见误区,稳健分析复杂动态关系。

wdx0123456的博客 927

Dagger2学习笔记之Singleton

目标类 public class B { @Inject public B() { } public String getName(){ return "BBBBBBB"; } } module类 @Module public class AModule { //单例获取 @Singleton

qq_33994844的博客 1656

RK3588设备树调试实战:解决NPU不加载、USB3.0识别异常与DP显示问题

本文深入探讨了RK3588设备树调试中的三大典型问题:NPU不加载、USB3.0识别异常与DP显示问题。通过详细的问题定位步骤、关键设备树修改和调试技巧,帮助开发者快速解决硬件适配中的挑战,提升RK3588平台的开发效率。

weixin_30576827的博客 477

2026年北京君正数字IC笔试试卷带答案

本文摘要:该文档是一份数字IC设计相关的考试试题,包含单选题、多选题、波形分析题和代码设计题。内容涵盖时序约束、半导体工艺、状态机设计、逻辑综合、异步FIFO设计等知识点。试题解析详细,重点考察数字电路基础、时序分析和Verilog代码实现能力。典型题目包括多周期路径设置、Moore/Mealy状态机区别、同步复位与异步复位特性、RISC-V架构特点等,并提供了异步FIFO的Verilog实现参考代码。(149字)

Open 113

Spring中scope=singleton 和 prototype 区别

Spring中scope=singleton 和 prototype 区别scope 属性值 singleton,表示是单实例对象 prototype,表示是多实例对象

m7k7k999的博客 764

第150篇 激光雷达点云分割——地面分离、聚类分析和物体提取

本文介绍了点云分割的三种经典几何方法:RANSAC地面分离、欧式聚类和区域生长。RANSAC通过随机采样拟合平面实现地面分割,欧式聚类基于空间距离进行物体分割,区域生长则结合法线信息提升分割精度。文章对比了各种方法的优缺点,提供了参数选择建议,并指出实际项目中常组合使用这些方法。最后给出了面试应答技巧,强调几何方法速度快、可解释性强等优势,适合大多数机器人项目的实时需求。

郑伟强dev的专栏 192

Spring注解驱动-@Scope注解设置作用域

@Scope注解的作用是用来管理对象的,管理当前的对象是否是单例等 @Scope注解提供了五种符方式 1)singleton (单一实例) 此取值时表明容器中创建时只存在一个实例,所有引用此bean都是单一实例。如同每个国家都有一个总统,国家的所有人共用此总统,而这个国家就是一个spring容器,总统就是spring创建的类的bean,国家中的人就是其它调用者,总统是一个表明其在spring中的s...

失忆๑的博客 423

数学工具箱:Clarke与Park变换

本文详细解析了FOC(磁场定向控制)中的核心数学工具——Clarke变换与Park变换。首先阐述了坐标变换的必要性:将复杂的三相交流系统简化为直流系统,便于精确控制。Clarke变换将三相静止坐标系转换为两相静止坐标系,减少变量数量;Park变换进一步将两相静止坐标系转换为两相旋转坐标系,实现交流量到直流量的转换。文章提供了两种变换的数学公式、物理意义图解及C语言实现代码,并简要介绍了逆变换过程。这些变换为电机控制提供了关键的数学基础,后续将结合GD32F303的FPU特性进行优化实现。

汽车电子软件领域知识分享 180

YOLOv11改进 | Conv篇 | 图像去雾卷积DEConv助力yolov11有效涨点(部署零额外开销)

本文介绍了一种最新改进机制用于低层视觉任务的细节增强卷积(DEConv)机制。DEConv在训练阶段采用"普通卷积+差分卷积"的多分支并联结构,增强网络对边缘、纹理等细节特征的学习能力;在推理阶段可折叠为标准3×3卷积,保持与普通卷积相同的计算效率。文中详细阐述了DEConv的工作原理、实现方法以及在YOLOv11中的应用步骤,包括核心代码解析、模型修改方法和训练配置。实验表明,该机制在去雾、去噪、超分等强调细节重建的任务中具有显著优势。文章还提供了完整的代码实现和训练指导.

Snu77的博客 2438

scope属性 singleton 和 prototype 的区别

scope属性 singleton 和 prototype 的区别

m0_69046085的博客 353

Windows 11 安装 Miniforge,配置国内源

本文详细介绍了在 Windows 11 系统中安装 Miniforge 的完整流程,包括下载、安装选项设置、配置国内镜像源(如清华大学源)以加速包管理,并启用 mamba 提升依赖解析与安装速度。同时涵盖 conda 与 mamba 的基本使用验证、PowerShell 初始化及环境提示符优化,帮助用户快速搭建高效、开源、免费的 Python 科学计算环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 4522

Dagger2 中的 Scope

  Dagger2 中虽然概念挺多的,但是大部分花时间都能理清。包括看人家的分析,Debug 代码下去也能懂。但是对于 scope 的用法以及实现原理还是有点难理解的。主要的问题也像简书上的文章所说:  自定义注解是怎么工作的?是不是命名了就能达到自己想要达到能够控制自己所提供的组建的生命周期的生命周期的功能?引用的说法就是这么一个回事:  比如Singleton就可以实现单例,PerActivi...

weixin_33742618的博客 200

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Dagger2进阶-Scope的源码探究

前言 Dagger2的介绍和配置 Dagger2基础的使用 Dagger2进阶-编译生成源码解读 Dagger2进阶-范围的控制(Scope和Singleton) Dagger2进阶-Scope的源码探究 项目源码传送门 学习了Scope,我们一定很疑惑为什么Scope注解只能做到对Component...

木木baby的博客 677

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Dagger2 基础入门与使用,android基础面试

DoubleCheck.java 生成对应的单例的对象= null;@Override。

m0_60721860的博客 786

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Dagger2的介绍和配置

前言 Dagger2的介绍和配置 Dagger2基础的使用 Dagger2进阶-编译生成源码解读 Dagger2进阶-范围的控制(Scope和Singleton) Dagger2进阶-Scope的源码探究 项目源码传送门​​​​​​​ Dagge...

木木baby的博客 1068

@Scope 看这一篇就够了——Dagger2 (二)

转载请标明出处:http://blog.youkuaiyun.com/xx326664162/article/details/67640509 文章出自:薛瑄的博客Dagger2 系列:Dagger2 入门详解(一)@Scope 看这一篇就够了——Dagger2 (二)网上关于@Scope的讲解,不是很详细,甚至有的是错误的。比如:Android:dagger2让你爱不释手-重点概念讲解、融合篇这篇文章网上引用

薛瑄的博客 1万+

2024年Android最新Dagger2 基础入门与使用(2),7年老Android一次坑爹的面试经历

愿你有一天,真爱自己,善待自己。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!//使用Inject 注解获取实例化对象User@Override。

2401_84544434的博客 1040

Spring学习

Spring框架基础学习

Januea的博客 490

高级Spring之Scope 详解

高级Spring之Scope 详解

qq_61313896的博客 1363

Dagger 2 系列(五)——进阶之@Scope 和 @Singleton

在上一篇Dagger 2 系列(四)——@Named 和 @Qualifier注解介绍,了@Named 和 @Qualifier注解,这篇文章,我们将会了解另外俩个注解:@Scope 和 @Singleton。@Scope 是什么@Singleton 是什么@Scope和 @Component 如何协同作战。Dagger2 的学习曲线确实是比较陡的,个人认为陡的点一是对依赖注入(控制反转)概念的理解,所以有了Dagger 2 系列(一)——基础篇之依赖注入。

hirezy 1150

Spring源码解析-Scopes之Singleton Scope(单例)和Prototype Scope(多例)

这是继这篇文章后对scope的扩展Spring源码解析-Scopes之Request、Session、Application Bean的作用域(scopes) 对于Spring里面的Bean的作用域(scope),我们在熟悉不过了,在Spring里面,平时开发中最经常遇到的作用域就是单例(si...

chengpaoqun3102的博客 577

scope作用

Scope默认是单例模式,即scope=“singleton”。 1.singleton单例模式, 全局有且仅有一个实例 2.prototype原型模式, 每次获取Bean的时候会有一个新的实例 3.request   request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效, 4.session  session作用域表示该针对每一...

weixin_45516375的博客 788

Dagger2 @Provides与@Binds的区别和联系

Dagger2 创建的区别和联系前言@Provides无参含参@Binds总结参考地址 前言 关于@Provides与@Binds的用法,经常叫不准,特地记录找到区别和联系 @Provides 无参 @Singleton @Provides static List<FragmentManager.FragmentLifecycleCallbacks> provideFragmentLifecycles() { return new ArrayList&lt

嗯... 2429
上一篇: Dagger2进阶-编译生成源码解读
下一篇: Dagger2进阶-Scope的源码探究
孤独浪人1
博客等级 码龄13年 75粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值