多个类中的依赖注入?

时间:2019-02-15 23:57:40

标签: java dependency-injection dagger-2

假设我要将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吗?

1 个答案:

答案 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
}

如前所述,匕首中的所有单例都与其组件实例相关联。如果创建一个新实例,它将拥有自己的单例。但是对于您以及该功能的客户端,您将得到不同的实例。

要修复此问题,请勿重新创建组件。例如,您可以将其存储在肯定不会被重新创建的位置。

我希望它能帮上忙。