Dagger2教程五之单例模式(原)

本文是Dagger2教程的一部分,通过实例详细讲解了如何使用Singleton注释实现单例,包括BeanModule和BeanComponent的改造,探讨了Singleton的假单例行为、作用范围,以及如何通过@Scope注释创建全局单例。
摘要由CSDN通过智能技术生成

        为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在这里下载源码(https://github.com/dushaofeng/DaggerDemo.git)。

        上一节我们介绍了《Dagger2教程四之多构造方法的情况》,这一节我们来介绍Dagger2中的单例模式的使用。

        Dagger2中有一个极其具有迷惑性的注释" @Singleton",字面意思感觉可以达到单例模式的作用,但实际上他的这个"单例"有点假。
        为什么说有点假呢?因为他的确可以在一些情况下达到单例的作用,但是又和我们通常意义上的单例模式相差很远,用错了,可能会适得其反。


一、Singleton注释的使用

        我们先来看一下这个注释的使用方法。
        如果我们在目标类中存在两个同样的注入类,它们实际上是两个不同的对象,请看这个定义:
        @Inject
        BeanNeedParam mBeanNeedParamCC;
        @Inject
        BeanNeedParam mBeanNeedParamDD;
        这说明Activity中的mBeanNeedParamCC和mBeanNeedParamDD两个变量都需要用BeanNeedParam来注入,接下来我们看它们是分别被注入,还是用同一个对象进行注入:
        //测试注入对象的地址
        if (mBeanNeedParamCC != null) {
            Log.d(TAG, "mBeanNeedParamCC 地址:" + mBeanNeedParamCC);
        }
        if (mBeanNeedParamDD != null) {
            Log.d(TAG, "mBeanNeedParamDD 地址:" + mBeanNeedParamDD);
        }
        其结果如图所示:
        
        我们看到这两个对象的地址不同,这表明, 虽然mBeanNeedParamCC和mBeanNeedParamDD都是用BeanNeedParam进行注入,但是它们是分别单独注入的,每个对象都是独立的
        如果我们想要实现单例模式该如何办呢?比如我们想要mBeanNeedParamCC和mBeanNeedParamDD是同一个对象该怎么办呢?
        这时候就可以用Singleton的注释了,进行如下改造:


1.1、改造BeanModule中的方法

        在提供BeanNeedParam的方法上面添加@Singleton注释:
        @Singleton
        @Provides
        public BeanNeedParam provider
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值