多个类中的依赖注入?

问题描述 投票:1回答:1

假设我想将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

java dependency-injection dagger-2
1个回答
1
投票

是的,在这种情况下,您将创建组件和模块的两个实例;因此,即使你将它标记为@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
}

如前所述,匕首中的所有单身人士都与他们的组件实例相关联。如果你创建一个新实例,它将拥有它自己的单例。但对于您而言,对于此功能的客户端,您最终会得到不同的实例。

要修复它,您不能重新创建组件。例如,您可以将其存储在肯定不会重新创建的位置。

我希望它有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.