假设我要将class A{
@Inject ObjClass obj
}
class B{
@Inject ObjClass obj
}
注入两个不同的类:使用匕首2
@Component @Singleton class InjectorComponent{
void inject(A a);
void inject(B b);
}
我有组件和模块:
@Module class InjectorModule{
@Provides
@Singleton
public ObjClass giveObj(){ return new ObjClass(); //This costs A LOT of CPU resources so dont want to call new ObjClass everytime}
}
A, B
在我的课程void runner(){
DaggerInjectorComponent comp = DaggerInjectorComponent.builder....
comp.InjectorModule(new InjectorModule(...)); //IMPORTANT LINE
comp.inject(this)
}
中,我有一个运行器方法,例如:
InjectorModule
我想知道的是,这是否会每次创建一个新的组件和一个新的ObjClass
以及一个新的ObjClass
?我想共享InjectorModule
的相同实例,那么该怎么做呢?
它总是创建一个新的StatFs
吗?
答案 0 :(得分:1)
是的,在这种情况下,您将创建组件和模块的两个实例;因此,即使已将其标记为@Singleton,也将具有ObjClass的两个实例。问题在于,作用域依赖项仅在组件对象范围内为单例。这意味着创建新的组件实例将导致创建新的依赖项实例。看例子: 让我们扩展您的 voidRunner 方法:
void runner(){
DaggerInjectorComponent comp = DaggerInjectorComponent.builder....
comp.InjectorModule(new InjectorModule(...));
comp.inject(this) //HERE YOU CREATE AND INJECT YOUR DEPENDENCY
comp.inject(this) // HERE NOTHING WILL HAPPEN, AS DEPENDENCY IS CACHED
}
运行此代码后,不会重新创建您的实例,因为它被标记为@Singleton,因此它是一个作用域依赖项,因此Dagger会知道对于此组件实例,需要初始化此对象仅一次。
但是,如果我们重新创建或组成该逻辑,它将停止工作:
void runner(){
DaggerInjectorComponent comp = DaggerInjectorComponent.builder....
comp.InjectorModule(new InjectorModule(...));
comp.inject(this) //HERE YOU CREATE AND INJECT YOUR DEPENDENCY
comp = null
comp = DaggerInjectorComponent.builder.... // component is recreated
comp.InjectorModule(new InjectorModule(...));
comp.inject(this) // HERE YOUR DEPENDECY IS REINITIALIZED, COMPLETELY NEW OBJECT
}
如前所述,匕首中的所有单例都与其组件实例相关联。如果创建一个新实例,它将拥有自己的单例。但是对于您以及该功能的客户端,您将得到不同的实例。
要修复此问题,请勿重新创建组件。例如,您可以将其存储在肯定不会被重新创建的位置。
我希望它能帮上忙。