假设我想将ObjClass obj
注入两个不同的类:使用dagger 2
class A{
@Inject ObjClass obj
}
class B{
@Inject ObjClass obj
}
我有组件和模块:
@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
?
是的,在这种情况下,您将创建组件和模块的两个实例;因此,即使你将它标记为@Singleton,你也会有两个ObjClass实例。问题是作用域依赖项仅在组件对象的范围内是单例。这意味着创建新的组件实例将导致创建新的依赖项实例。看看这个例子:让我们扩展你的void runner方法:
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
}
如前所述,匕首中的所有单身人士都与他们的组件实例相关联。如果你创建一个新实例,它将拥有它自己的单例。但对于您而言,对于此功能的客户端,您最终会得到不同的实例。
要修复它,您不能重新创建组件。例如,您可以将其存储在肯定不会重新创建的位置。
我希望它有所帮助。