“一盘沙拉”带你入门Dagger2(三)之@Qualifier

dagger2的所有用法 dagger2的所有用法, 包含基本用法, @Named, @Singleton, 自定义Qualifier, 自定义Scope, SubComponent, 全局Singleton等等 立即下载

系列文章

“一盘沙拉”带你入门Dagger2(一)之HelloWorld

“一盘沙拉”带你入门Dagger2(二)之带参数怎么办

“一盘沙拉”带你入门Dagger2(三)之@Qualifier

“一盘沙拉”带你入门Dagger2(四)之 @Singleton

“一盘沙拉”带你入门Dagger2(五)之 @Scope

当一个类有两个构造函数时,使用Dagger2时,如何获取指定构造函数new出来的对象

或者说虽然这有一个构造函数,但是这个构造函数new出了两个具有不同属性的对象,我们如何获取到他们,比如Person类,他有一个属性Sex,new了第一个Person,设置sex=“male”,new了第二个Person,设置sex=“female”,我们如何在注入依赖时候,准确注入一个男人或者女人呢

下面还是以两个构造函数的问题为例说明问题,这个说明了,自然解释了男人女人的问题

我们Salad里要添加一种新水果—Apple,他有两个构造函数,我们要在Salad类里面,分别得到这两个不同的构造函数new出的Apple对象,

使用@Qualifier限定符来解决这个问题

@Named(“String”)也能解决这个问题,只不过,传递的值只能是字符串,用@Qualifier更灵活一点

  1. 新建Apple类

    public class Apple {
        String color;
    
        public Apple() {
            Log.e("TAG", "我是一个普通的苹果");
    
        }
    
        public Apple(String color) {
            this.color = color;
            Log.e("TAG", "我是一个有颜色的苹果");
    
        }
    
    }
  2. 自定义一个限定符,用来区分是哪个构造函数new出的对象

    /**
     * 自定义一个限定符
     */
    @Qualifier//限定符
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Type {
        String value() default "";//默认值为""
    }
  3. 修改 SaladModule,使用限定符@Type来区分不同的构造函数new出来的对象

    @Module
    public class SaladModule {
    
       .........
    
        @Type("normal")//使用限定符来区别使用哪个构造函数返回对象
        @Provides
        public Apple provideNormalApple() {
            return new Apple();
        }
    
        @Type("color")//使用限定符来区别使用哪个构造函数返回对象
        @Provides
        public Apple provideColorApple(String color) {
            return new Apple(color);
        }
    
        //    由于我们的Apple构造函数里使用了String,所以这里要管理这个String(★否则报错)
        //    int等基本数据类型是不需要这样做的
        @Provides
        public String provideString(){
            return new String();
        }
    
    
    }
  4. 修改SaladComponent

    @Component(modules = {SaladModule.class})//指明要在那些Module里寻找依赖
    public interface SaladComponent {
    
        .........
    
        @Type("normal")//关键靠这个限定符来区分调用哪个构造函数
        Apple provideNormalApple();//这个方法名并不重要,只要是provide开头就行,但是建议和module里一致
    
        @Type("color")
        Apple provideColorApple();
    
    
        String provideString();
        //注意:下面的这个方法,表示要将以上的三个依赖注入到某个类中
        //这里我们把上面的三个依赖注入到Salad中
        //因为我们要做沙拉
        void inject(Salad salad);
    
    }
  5. 在目标类Salad里注入Apple依赖,我们要分别注入两个构造函数new出的对象

    public class Salad {
    
      .........
    
        @Inject
        @Type("normal")
        Apple normalApple;
    
        @Inject
        @Type("color")
        Apple colorApple;
    
        public Salad() {
            // DaggerSaladComponent编译时才会产生这个类,
            // 所以编译前这里报错不要着急(或者现在你先build一下)
            SaladComponent saladComponent = DaggerSaladComponent.create();
            saladComponent.inject(this);//将saladComponent所连接的SaladModule中管理的依赖注入本类中
            makeSalad(pear, banana, saladSauce);
        }
    
        private void makeSalad(Pear pear, Banana banana, SaladSauce saladSauce) {
            Log.e("TAG", "我在搅拌制作水果沙拉");
        }
    }
  6. 测试

    09-01 14:57:14.559 31918-31918/com.demo.dagger2demo2 E/TAG: 我是一个梨
    09-01 14:57:14.560 31918-31918/com.demo.dagger2demo2 E/TAG: 我是一个香蕉
    09-01 14:57:14.560 31918-31918/com.demo.dagger2demo2 E/TAG: 我是沙拉酱
    09-01 14:57:14.561 31918-31918/com.demo.dagger2demo2 E/TAG: 我是一个小刀
    09-01 14:57:14.562 31918-31918/com.demo.dagger2demo2 E/TAG: 我可以切水果
    09-01 14:57:14.562 31918-31918/com.demo.dagger2demo2 E/TAG: 我是一个桔子
    09-01 14:57:14.562 31918-31918/com.demo.dagger2demo2 E/TAG: 我是一个小刀
    09-01 14:57:14.563 31918-31918/com.demo.dagger2demo2 E/TAG: 我是一个普通的苹果
    09-01 14:57:14.563 31918-31918/com.demo.dagger2demo2 E/TAG: 我是一个有颜色的苹果
    09-01 14:57:14.563 31918-31918/com.demo.dagger2demo2 E/TAG: 我在搅拌制作水果沙拉
    
Windows Server 2019整机备份与异机还原实战:从虚拟机到物理机的完整迁移指南 本文详细介绍了Windows Server 2019整机备份与异机还原的实战操作,涵盖从虚拟机到物理机的完整迁移流程。通过环境准备、备份策略设计、具体操作步骤及迁移后优化等内容,帮助用户实现系统环境的无缝迁移,特别适用于服务器硬件升级、数据中心迁移等场景。 阅读详情

相关推荐

用野火FPGA开发板(EP4CE10)手把手教你实现一个高精度频率计(附完整Verilog代码)

本文详细介绍了基于野火FPGA开发板(EP4CE10)实现高精度频率计的全过程,涵盖等精度测量法的核心原理、Verilog代码实现及优化技巧。通过实际案例演示,帮助开发者掌握1Hz-50MHz范围、精度达0.1%的频率计设计方法,并提供完整的工程代码和实测数据。

weixin_29261711的博客 439

学习Dagger2笔记:【5】@Qualifier

dagger与抽象 继承、封装和多态是面向对象的三大特征,这三大特征无一不是围绕着抽象这个词展开的,但在前几篇的例子中,我们的依赖都是具体的类型,比如Computer、CPU、Memory,严重违反了依赖倒置原则: 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的 总之,我们接下来需要加上抽象的思想,看看dagger怎样处理 新增需求 现在我们将Co...

Cmd的笔记本 936

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 546

Android Dagger2 自定义@Qualifier

先定义两个Qualifier,待会在Module中用于区分两个Person @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface QualifierStudent {} @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface Qualifier...

野猿新一 948

新手自己动手设置3D-slicer中文版(超详细图文)

3DSlicer是一个开源的免费软件,用于医学图像分析(包括配准和交互式分割)和可视化(包括3D渲染)以及用于图像引导治疗研究的软件平台。复制qm文件,粘贴于3D-slicer文件相关文件夹内,\bin\translations\。打开3dslicer,edit菜单下Application Settings,支持的操作系统:Linux,Mac OSX和Windows。本人英语太差,所以第一反应就是中文版,官网无中文版下载,下载后不能直接使用,必须要发布成qm文件;qm文件已经生成,位于ts文件同一文件夹。

linjianping513的博客 9835

YOLOv12改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是基于StarNet的YOLOv12轻量化改进方法研究。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 1215

Android常用Qualifiers(限定符)

xxhdpi:提供给超超高分辨率设备的资源(320dpi~480dpi)xhdpi:提供给超高分辨率设备的资源(240dpi~320dpi)mdpi:提供给中等分辨率设备的资源(120dpi~160dpi)hdpi:提供给高分辨率设备的资源(160dpi~240dpi)ldpi:提供给低分辨率设备的资源(120dpi以下)normal:提供给中等屏幕设备的资源。xlarge:提供给超大屏幕设备的资源。small:提供给小屏幕设备的资源。large:提供给大屏幕设备的资源。land:提供给横屏设备的资源。..

跟踪世界脚步 897

10、皮肤 - 神经记录实验全流程解析

本博客详细介绍了皮肤-神经记录实验的全流程,涵盖实验所需的材料准备和具体操作方法。内容包括细胞外记录设备的设置、合成间质液(SIF)的制备与调节、小鼠后爪皮肤和胫神经的手术解剖步骤、清洁解剖后的记录准备、纤维分离与感受野识别方法,以及神经纤维机械响应的测量。该实验为研究神经纤维的活动与功能提供了重要的技术支持,适用于神经科学研究领域。

backprop5master的博客 185

android dagger2 懒加载,Dagger2使用简析(二)——@Scope、@Qualifier、@binds、dependencies、Lazy...

在了解了简单注入对象的使用后,我们将问题升级。我们平常开发中为了节省资源,在APP的生命周期内很多对象都是作为单例存在的,因此现在我们尝试解决三个问题将一个对象注入到Application中,并且保证它在整个APP的生命周期内是单例的这个对象应该符合依赖倒置原则,我们使用其抽象类来作为引用之后为了方便在MainActivity中使用它,我们还应该能够将它注入到MainActivity中1. 如何解...

weixin_39775872的博客 403

在 PFCG 中完成 SAP Fiori 对象分配:把 Business Catalog、Space、Page 与授权一次讲透

摘要:SAP Fiori权限配置的关键在于理解Business Catalog与Space的分层授权逻辑。传统SAP GUI中直接分配事务码的方式不适用于Fiori环境,必须通过PFCG为角色分配Catalog(提供应用访问权限)和Space(控制首页展示结构)。Catalog会自动解析所需OData服务授权,而Space则决定用户在Launchpad中看到的导航布局。常见错误包括直接分配Page而非其所属Space,或仅配置Space而忽略Catalog。最佳实践是优先使用Catalog驱动授权提议,再在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 327

使用VNA(Vector Network Analyzer)对S参数进行去嵌(一)

传统上,RF和微波组件被设计成具有同轴接口的封装。通过连接一系列这些单独的同轴设备,可以容易地制造复杂的系统。使用使用类似同轴接口的标准测试设备可以很容易地测量这些部件和系统的性能。然而,现代系统需要更高水平的组件集成、更低的功耗和更低的制造成本。射频组件正在迅速从使用昂贵同轴接口的设计转向使用印刷电路板和表面贴装技术(SMT)的设计。传统的同轴接口甚至可以从最终产品中取消。这就给设计者留下了用需要同轴接口的测试设备测量这些射频和微波组件性能的问题。解决方案是使用连接同轴和非同轴传输线的测试夹具。

小孟同学的博客 1万+

告别依赖注入混乱:AndroidAnnotations中Qualifier与Named注解的实战指南

在Android开发中,依赖注入是提升代码可维护性和模块化的关键技术。然而,当项目中存在多个相同类型的依赖时,如何准确区分并注入正确的实例常常让开发者头疼不已。AndroidAnnotations框架通过提供强大的依赖注入机制,结合Qualifier和Named注解,为解决这一难题提供了优雅的解决方案。本文将详细介绍如何在AndroidAnnotations中使用这些注解来实现清晰、可维护的依赖管

gitblog_00939的博客 325

华为OD面试手撕真题 【合并相邻且相等的元素】多语言题解

华为OD面试高频手撕真题【合并相邻且相等的元素】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 545

Dagger2 中的 Qualifier

Dagger2 中创建实例对象有两种方式: Inject 维度:通过用 Inject 注解构造函数 Module 维度:通过工厂模式的 Module 创建 其中,Module 的优先级比 Inject 高。基于同样维度的不同实例,比如 @Inject A(){}和@Inject A(B b){},系统就会抱错,这种情况叫做依赖注入迷失。 Qualifier限定符 就是解决依赖注入迷失的。 1....

lk_123456的专栏 637

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android—Dagger2-让你爱不释手--重点概念讲解、融合篇(附视频讲解)(2)

已经提到,Component是一个注入器(Injector),同时也起着桥梁的作用,一端是端(创建类实例即负责生产类实例,下面会用该词来指代),另一端是端(目标类需要进行依赖初始化的类,下面都会用目标类一词来指代),请看下图:这2个维度是有优先级之分的,Component会首先从Module维度中查找类实例,若找到就用Module维度创建类实例,并停止查找Inject维度。否则才是从Inject维度查找类实例。所以创建类实例级别Module维度要高于Inject维度。

2401_86968753的博客 2216

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

spring @Autowired注解(在不配合@Qualifier使用的情况下),并不仅仅按照byType进行注入,在有些情况下会使用byName策略

今天因为要用到消息队列,所然后项目中没有搭建专门的分布式MQ,但有redis,所以我就去看了下项目里的redis配置信息。。然后就看见了神奇的一件事(以前一直以为这是错误的)。 先看spring的配置文件,配置了下面两个bean。 其实就是序列化方式不一样,一个jdk的方式,一个json。 注意id,额,我指的是两个bean的id不同,第二个命名用two这个请不要吐槽,因为这也不是我...

祁东握力的博客 777

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android应用框架之Dagger依赖注入框架初步

主要注解 javax.inject包 @Inject @Scope和@Singleton @Named和@Qualifier dagger包 @Module和@Provides @Component @Subcomponent Lazy:非注解类,用于延迟注入 注解使用 @Inject注解 用于标记需要注入的依赖,或者标记用于提供依赖的构造方法。 在Dagger2中@Inject有3种使用...

qinhai1989的专栏 680

狂神说Spring04:自动装配

狂神说Spring系列连载课程,通俗易懂,基于Spring最新版本,欢迎各位狂粉转发关注学习。禁止随意转载,转载记住贴出B站视频链接及公众号链接!Bean的自动装配自动装配说明自动装配是...

狂神说 1万+

(九) Dagger2 @Qualifier案例分析

代码示例 class Tiger { String name; public Tiger(String name) { this.name = name; } public Tiger() { } public void sleep() { System.out.println("Tiger sleeping"); } } // 自定义Qualifier注解 @Qualifier public @interface Ti

碧云天丶 329

Dagger2 用@Qualifier解决依赖冲突

Dagger2中,如果Module中有@Provides标注的多个方法同事提供同一类型的依赖,IDE编译时在会报错,通俗的讲就是,Dagger2不知道该用哪个方法提供的依赖。 这里可以通过@Qualifier来解决,@Qualifier是javax.inject包下的注解,限定标识符。@Qualifier自定义注解:@Qualifier @Documented @Retention(Retenti

little_shengsheng的博客 1506

Dagger 2 系列(四) -- 基础篇:@Named 和 @Qualifier

代付

Strange_Monkey的博客 2672

android studio Available qualifiers(可用资源限定符)笔记(待完善)

资源限定符的各个意思,做个笔记 1.Ratio(屏幕比例) 只有两个选项Long和Not-Long https://stackoverflow.com/questions/11752381/android-resource-notlong-long-identifiers-not-working 根据以上问答得到的结果,屏幕比例小于基线(800/480=1.6)时,会调用not-long下...

limingbocsdn的博客 3765

依赖注入 javax.inject中@Inject、@Named、@Qualifier和@Provider用法

@Inject     @Inject支持构造函数、方法和字段注解,也可能使用于静态实例成员。可注解成员可以是任意修饰符(private,package-private,protected,public)。注入顺序:构造函数、字段,然后是方法。父类的字段和方法注入优先于子类的字段和方法,同一类中的字段和方法是没有顺序的。     @Inject注解的构造函数可以是无参或多个参数的构造函

z69183787的专栏 4万+

最简单的Dagger2入门教程

在上一篇博客中总结了依赖注入的原理与实现方式。 依赖注入的原理 依赖注入就是将调用者需要的另一个对象实例不在调用者内部实现,而是通过一定的方式从外部传入实例,解决了各个类之间的耦合。那么这个外部,到底指的是哪里,如果指的是另一个类,那么,另一个类内部不就耦合了。能不能有一种方式,将这些构造的对象放到一个容器中,具体需要哪个实例时,就从这个容器中取就行了。那么,类的实例和使用就不在有联系了,而是通过一

茅屋 2万+

Dagger2 使用正确姿势。

Dagger2 使用正确姿势。上一篇文章《Dagger2 这次入门就不用放弃了》中介绍了Dagger2的一些显浅的使用方式,我觉得是非常适合入门Dagger2的傻瓜式讲解,后来发现有些内容讲的不够仔细,有些细节没有详细解释清楚。参考了以下三篇文章后,对之前的内容进行一些补充。 Android:dagger2让你爱不释手-基础依赖注入框架篇 Android:dagger2让你爱不释手-重点概念讲解、融

wangjianfengnb 2万+

Dagger2学习笔记之Qualifier

dagger2在使用中,会出现两个方法返回对象相同时的情况,那么如何区分呢。 由Dagger2学习笔记之dependencies更改的demo public class Present { String ss = "呵呵哒"; public Present(Context context) { } public Present(String name) {

qq_33994844的博客 520
上一篇: “一盘沙拉”带你入门Dagger2(二)之带参数怎么办
下一篇: “一盘沙拉”带你入门Dagger2(四)之 @Singleton
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值