为了介绍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