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

Knife4j,拯救Swagger不那么美观的页面和差点意思的功能 前言: Swagger现在已经成了最流行的接口文档生成与管理工具,但是你是否在用的时候也在吐槽,它是真的不好看,接口测试的json数据没法格式化,测试地址如果更改了还要去改配置,接口测试时增加token验证是真的麻烦......等等,拿什么拯救你,swagger同学! 针对Swagger的种种缺点,Knife4j就呼之欲出了。 正文: 一、先看一下它长什么样子吧 看一下官方的介绍: Knife4j的前身是swagger-bootstr... 阅读详情

系列文章

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

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

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

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

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

像上文所说我们要让苹果、梨使用同一把刀,让香蕉使用另外一把刀,开始吧

  1. 在Dagger2中,我们可以通过自定义Scope来实现局部单例。
    首先让我们先来定义一个局部作用域:

    /**
     * 自定义一个作用域
     */
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface KnifeScope {
    }
  2. 在Module里使用 @KnifeScope,

    /**
     * 在Module里使用 @KnifeScope,
     * 指定目前这个Module的使用范围
     */
    @Module
    public class KnifeMofule {
    
        @KnifeScope
        @Provides
        public Knife provideKnife(){
            Knife knife = new Knife();
            return knife;
        }
    }
    
  3. 在Component里使用@KnifeScope

    /**
     * 在Component里使用@KnifeScope,
     * 与之前的KnifeModule相呼应,
     * 指明目前这个Component的使用范围
     */
    @KnifeScope
    @Component(modules = KnifeMofule.class)
    public interface KnifeComponent {
    //    注意:这里我们只inject了苹果和梨,说明我们要把KnifeModule
    //    所建立的实例,注入到苹果、梨里(而不注入到香蕉里)
        void  inject(Apple apple);
        void  inject(Pear pear);
    }
  4. 创建MyApp,别忘了清单文件注册,使用MyApp来获取,唯一的KnifeComponent

    public class MyApp extends Application{
    //这里不一定非得使用static,由于我注入的不是Activity,无法用getApplication来得到MyApp的对象(否则还得传入一个Activity),所以为了方便,使用了静态。
        private static KnifeComponent knifeComponent;
    
        @Override
        public void onCreate() {
            super.onCreate();
    //        为了实现局部共享一个实例,
    //        我们需要在Application里,首先得到knifeComponent的实例
    //        由于Application的onCreate方法,在应用程序里面,只运行一次
    //        所以只得到了一个knifeComponent
    //       (后面我们通过getKnifeComponent来得到这唯一的一个getKnifeComponent)
    //        ok,我们之后会通过这个唯一的KnifeComponent来得到他所连接的KnifeModule
    //        所提供的Knife的实例,再把这个实例注入到苹果、梨里面去,从而实现了苹果、梨
    //        会共享这个实例。
    //        而香蕉里的Knife,我们要重新建立一个Module和Component来获取Knife的新实例
    //        这样就实现了Knife的实例,在苹果、梨之间局部共享,而香蕉使用的是另外一个实例
            knifeComponent = DaggerKnifeComponent
                    .builder()
                    .knifeMofule(new KnifeMofule())
                    .build();
        }
    
        public  static  KnifeComponent getKnifeComponent() {
            return knifeComponent;
        }
    }
    
  5. 把Knife注入到苹果、梨里面

    public class Apple {
        @Inject
        Knife knife;
    
        public Apple() {
            MyApp.getKnifeComponent().inject(this);
            Log.e("knife", "苹果里的knife内存地址:" + knife.toString());
        }
    
    public class Pear {
        @Inject
        Knife knife;
        public Pear(){
            Log.e("TAG", "我是一个梨");
            MyApp.getKnifeComponent().inject(this);
    
            Log.e("knife", "梨里的knife内存地址:"+knife.toString());
        }
    }
  6. 测试:内存地址是一样的,证明使用的是同一个实例。

    E/knife: 苹果里的knife内存地址:com.demo.dagger2demo2.Knife@16e3e55f
    E/knife: 梨里的knife内存地址:com.demo.dagger2demo2.Knife@16e3e55f

如何让香蕉用另一把刀呢,很简单煎饼果子来一套即可(在写一套Module和Component)

  1. Module

    @Module
    public class KnifeForBananaModule {
        @Provides
        public Knife provideKnife(){
            Knife knife = new Knife();
            return knife;
        }
    }
    
  2. Component

    @Component(modules = KnifeForBananaModule.class)
    public interface KnifeForBananaComponent {
        void inject(Banana banana);
    
    }
  3. 注入到香蕉里

    public class Banana {
        @Inject
        Knife knife;
    
        public Banana() {
            KnifeForBananaComponent knifeForBananaComponent = DaggerKnifeForBananaComponent.builder().knifeForBananaModule(new KnifeForBananaModule()).build();
            knifeForBananaComponent.inject(this);
            Log.e("knife", "kinfe在香蕉中的内存地址:" + knife.toString());
        }
    }
  4. 测试:苹果和梨使用了同一个Knife的实例,而香蕉使用了另一把Knife的实例,实现了局部共享实例啦

    E/knife: 苹果里的knife内存地址:com.demo.dagger2demo2.Knife@336e5075
    E/knife: 梨里的knife内存地址:com.demo.dagger2demo2.Knife@336e5075
    E/knife: kinfe在香蕉中的内存地址:com.demo.dagger2demo2.Knife@10ac0fa3

    下一篇文章,说说Component之间的依赖关系

使用PlotNeuralNet绘制深度学习网络图的基本操作 阅读详情

相关推荐

Excel-MCP实战指南:零代码实现大模型与Excel的智能交互

本文详细介绍了Excel-MCP工具如何实现大模型与Excel的无缝交互,无需编写代码即可完成数据读写、图表生成等复杂操作。通过实战案例展示了Excel-MCP在销售报表自动化、财务对账等企业级场景中的应用,大幅提升工作效率。文章还提供了安装指南、核心功能解析和常见问题解决方案。

weixin_29212429的博客 432

常用的面试题目,Dagger2之Kotlin写法(1),一个Android应届生从上海离职

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

wfegre的博客 674

别再死记硬背了!用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率

本文深度解析如何使用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率(GTFP)。通过详细的模型选择对比、数据准备策略和MaxDEA操作流程,帮助研究者科学构建指标体系并准确解读结果,提升环境管理研究的实证分析能力。

weixin_28731231的博客 313

Dagger2进阶学习,2024Android笔试题总结

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

1079

Open3D——RANSAC 三维点云空间直线拟合【2025最新版】

使用RANSAC算法在点云数据中拟合三维空间直线的python代码实现。博客长期更新,本文最新更新时间为:2025年3月23日。

点云侠的博客 7353

使用 PLS 回归进行近红外光谱的异常值检测

在光谱数据中,并非每个数据点都是有效的,因此,在构建模型时找到与大部分数据不符合的数据点是一种必要的操作。这些数据我们称之为。在这篇文章中,我们将使用PLS回归进行红外光谱数据的异常值检测。

qq_44204759的博客 1422

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

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

薛瑄的博客 1万+

解决群晖NAS无法拉取docker镜像问题

在2024-06-01日以前,使用SSH登录后是可以直接拉取docker镜像的;但是之后当我们使用SSH登录上群晖NAS,使用【sudo -i】切换到超管拉取镜像会提示报错【error pulling image configuration: Get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/cf/cff6b68a194a672fd337d8728bfb252071012cce6

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2万+

Android 神兵利器Dagger2使用详解(四)Scope注解的使用及源码分析

前言在我的上一篇文章Android 神兵利器Dagger2使用详解(三)进阶篇,不可自拔爱上Dagger2 中,我们以简单的案例对Dagger2依赖注入库在实际开发中的使用方法进行了学习。本文内容: 1.@Singleton 全局单例 注解的使用 2.自定义@Scope 局部单例 注解的使用 3.通过 源码分析 @Singleton和@Scope注解是 如何实现单例 的。 一

却把清梅嗅的博客 5280

Android 14.0 系统开机屏幕设置默认横屏显示

在14.0的系统ROM产品定制化开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了

安卓兼职framework和app工程师的博客 2150

ATS Request中的PASID的作用是什么

摘要: PASID(进程地址空间标识符)是PCIe ATS(地址转换服务)中的关键组件,用于标识不同进程或虚拟机的地址空间。其主要作用包括:1)支持多进程共享设备时隔离地址空间;2)实现共享虚拟地址(SVA),允许用户态程序直接访问设备;3)提升虚拟化性能(如SIOV),通过PASID区分虚拟机请求;4)增强安全性,基于PASID限制设备内存访问权限。PASID通过20位标识符在TLP前缀中传递,与IOMMU协作完成地址转换与缓存,适用于高性能计算、AI及虚拟化场景,但依赖硬件支持和软件适配。

元直的博客 1560

2024年最新“一盘沙拉”带你入门Dagger2(五)之 @Scope,互联网大厂面试难度排行

测试:苹果和梨使用了同一个Knife的实例,而香蕉使用了另一把Knife的实例,实现了局部共享实例啦。(img-y3SqCrK3-1715144036890)]测试:内存地址是一样的,证明使用的是同一个实例。下一篇文章,说说Component之间的依赖关系。BAT TMD大厂Android高频面试题。赢取流量/现金/优快云周边激励大奖。Android对标阿里P7学习视频。把Knife注入到苹果、梨里面。Android进阶学习全套手册。

2301_82244718的博客 754

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

系列文章“一盘沙拉”带你入门Dagger2(一)之HelloWorld“一盘沙拉”带你入门Dagger2(二)之带参数怎么办“一盘沙拉”带你入门Dagger2(三)之@Qualifier“一盘沙拉”带你入门Dagger2(四)之 @Singleton“一盘沙拉”带你入门Dagger2(五)之 @Scope引子使用Dagger2这个框架,可以高效的在Android(java)中实现“依赖注入”。什么是

Android_Study_OK的博客 3733

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

@Singleton可以方便地实现单例(全局单例)我们在Salad类里面引入两个Orange的实例,查看他们的内存地址public class Salad { @Inject//桔子1 Orange orange1; @Inject//桔子2 Orange orange2; ... public Salad() { ... Log.e("TA

Android_Study_OK的博客 4816

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Dagger2关于Scope的理解

看简书的两篇文章的时候关于Dagger2中的@Singleton的理解和Android:dagger2让你爱不释手-重点概念讲解、融合篇,里面讲解了关于Scope的作用和SingleTon为什么能实现单例。在上一篇文章中也有讲Scope的作用。这里再说一下,Scope是用于组织Component。在Dagger2中, Scope机制关注的是保持单例和Scope存在周期一致。 实际上,它意味着@Ap...

Iturbo 1309

Android:Dagger2学习之由浅入深

概述Dagger2是一款使用在Java和Android上的静态的,运行时依赖注入框架.官方地址:http://google.github.io/dagger/记得当初刚学习Dagger2的时候看了许多博客,但是感觉上手依然困难,所谓光学不练就是这个意思吧时至今日,用上此框架的同仁越来越多.分析文章也很多,上手相对要简单了许多.学习Dagger2最先要明白的是其各个注解的含义及工作原理,这样才可以快速

BoBoMEe 1395

详解 Dagger2 的 @Scope 和 @Subcomponent

个人觉得网上关于 dagger2 文章中关于 @Scope 和 @Subcomponent 解释的并不是很详细,也可能是我个人能力有限不能够理解,所以写下这篇文章,希望能够帮助后人更方便的入门。 @Scope 是什么 @Scpoe 的使用 @Subcomponent 是什么 @Subcomponent 的使用 @Subcomponent 和 @Component 的实际使用场景定义 @Scope 是

joker 2901

android dagger2 单例,Dagger2 in Android(三)Scope与生命周期

前言之前我们已经学习了 Dagger 的基础知识、模块化管理,本章将是 Dagger 基础使用的最后一章。Scope 被误称 Dagger 的黑科技,但实际上它非常简单,但错误理地解它的人却前仆后继。希望小伙伴们认真阅读这一章,第一次学习时一定要正确理解,不然后边再纠正会感觉世界观都被颠覆了。@Scope终于来了。Scope 正如字面意思,它可以管理所创建对象的“生命周期”。Scope 的定义方式...

weixin_39638929的博客 323

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

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

木木baby的博客 1633

Dagger2中@Scope注解详解

2016年10月17日更新 我认为关于@Scope的作用讲的最好最清晰的一篇,从零开始的Android新项目4 - Dagger2篇, 1.Dagger2中@Singleton和自己定义的@PerActivity、@ApplicationScoped等代码上并没有什么区别,@Scope @Documented @Retention(RUNTIME) public @interface Singl

afunyusong的专栏 5060

Android Dagger2中的Scope到底是干什么用的

凡是用@Scope标注的标注,比如@SIngleton这种的,不论是他提供的,还是你自己自定义的,除了名字不一样之外,效果都是一样的,也就是:只要用这种标注标记了你module中的某个@providers标记的方法,那么这个方法的返回值就会由一个DoubleCheck包装,对外提供一个单例,同一个DaggerCcomponent不论注入几个新的实体,都是用同一个单例,如果不标记,那么多次注入的就是...

u011856790的博客 765

“一盘沙拉”带你入门Dagger2(六)之Component依赖

如果我们有一套做好的煎饼果子(一套齐全的依赖体系,Module、Component),另外一个类需要这套依赖体系的一个对象作为依赖,怎么办,还需要再为这个对象,建立一套新的Module和Component吗 显然是不用的,Component之间是可以依赖的 开始举例子:1. 我们先做一套的依赖体系,这个体系里,依赖的Tomato西红柿Tomato.classpublic class Tomato

Android_Study_OK的博客 4937

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

如果被依赖类的构造函数带有参数,要把这个参数的类型也管理起来 现在要在Salad里新加入一个水果Orange,但是Orange的构造函数里需要传入一个Knife来切水果,那么如何注入这个Orange呢?新增的两个类public class Orange { Knife knife; public Orange(Knife knife){ this.knife=kn

Android_Study_OK的博客 4521

@Singleton能保证单例吗

scope里有个@Singleton,它能保证单例吗? 答案是不完全能(或者是说是有条件的能) 当你不使用@Singleton时,在同一个宿主类里,注入两次同一个类的对象你会发现,两个对象的地址不一样 当你使用了@Singleton,在同一个宿主类里,注入两次同一个类的对象你会发现,两个对象的地址变得一样了 但是使用了@Singleton后,此时你在另一个宿主内,再次注入两次同一个类...

Android_Study_OK的博客 3478

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

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值