下面来了解@Singleton 和 @Scope
@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}
@Singleton其实就是一个@Scope,和自定义的@ActivityScope和@ApplicationScope没有区别,之所以自定义,因为@Scope是有生命周期的,他的生命周期和创建Component一样,这个后面再讲解,写看简单使用

注入单例对象,需要Component也为单例
@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);
}
同样提供对象的方式也有俩种,一种是在MainModule中直接提供,还有就是构造方法中直接注入,我使用构造直接注入
@Singleton
public class DaggerBean {
private String name;
private String type;

@Inject
public DaggerBean(@StringName("name")String name,@StringName("type")String type) {
this.name = name;
this.type = type;
}
此时在MainActivity中,多次注入将会是同一个对象
@Inject
DaggerBean bean1;
@Inject
DaggerBean bean2;

Log.e(TAG, "bean1: " + bean1);
Log.e(TAG, "bean2: " + bean2);

E/MainActivity: bean1: [email protected]
E/MainActivity: bean2: [email protected]

分析一下他的源码会发现
this.daggerBeanProvider =
DoubleCheck.provider(DaggerBean_Factory.create(providerNameProvider, providerTypeProvider));
提供daggerBean的对象使用了DoubleCheck看下他里面是使用单例的方式来提供对象的
@SuppressWarnings("unchecked") // cast only happens when result comes from the provider
@Override
public T get() {
Object result = instance;
if (result == UNINITIALIZED) {
synchronized (this) {
result = instance;
if (result == UNINITIALIZED) {
result = provider.get();
/* Get the current instance and test to see if the call to provider.get() has resulted
* in a recursive call. If it returns the same instance, we'll allow it, but if the
* instances differ, throw.
*/
Object currentInstance = instance;
if (currentInstance != UNINITIALIZED && currentInstance != result) {
throw new IllegalStateException("Scoped provider was invoked recursively returning "+ "different results: " + currentInstance + " & " + result + ". This is likely " + "due to a circular dependency.");
}
instance = result;
/* Null out the reference to the provider. We are never going to need it again, so we
* can make it eligible for GC.
*/
provider = null;
}
}
}
return (T) result;
}


@Scope的生命周期例子如下

Dagger2学习笔记3

Dagger2学习笔记3
Dagger2学习笔记3
E/MainActivity: bean1: [email protected]
E/MainActivity: bean2: [email protected]
E/MainActivity: bean3: [email protected]

上面会发现,MainCompont提供注入的DaggerBean对象为同一个对象

所有可以创建ApplicationScope,inject的时候传入Application对象,此时ApplicationScope的生命周期就是整个app的运行周期,ActivityScope同理



相关文章: