吉斯.注入到构造函数中



我有一个单例:

public class MySingleton{
  public static getInstance(){//typical singleton getInstance
    ...
  }
  //fields
  private static volatile instance;
  @Inject
  private AnotherClassInstanceThatIWantToInjectHere anotherClassInst_BlaBla;
  private MySingleton(){
    ...
    anotherClassInst_BlaBla.doSmth();//NullPointerException happens!
    ...
  }
}

这种NPE的原因是什么?发生这种情况是因为它是构造函数还是因为它是单例?

当调用 MySingleton 的构造函数时,instance为 null。 Guice必须先构造 MySingleton 的实例,然后才能注入任何内容。

Guice 有一个单例的概念:要么在模块中将类绑定到单例作用域中,要么将类注释为 @Singleton 。然后你只需像往常一样注射:

@Singleton
public class MySingleton {
  private AnotherClassInstanceThatIWantToInjectHere anotherClassInst_BlaBla;
  @Inject public MySingleton(AnotherClassInstanceThatIWantToInjectHere anotherClassInst_BlaBla) {
    this.anotherClassInst_BlaBla = anotherClassInst_BlaBla;
    anotherClassInst_BlaBla.doSmth();
  }
}
在这种情况下

anotherClassInst_BlaBla是一个实例变量,我想这就是您选择setter注入的原因。由于它是一个实例变量,并且 setter 注入需要一个实例来设置此变量,因此需要创建/构造 MySingleton 类的实例才能使用 anotherClassInst_BlaBla。

简而言之,您应该在调用构造函数 MySingleton() 后调用 doSmth() 方法,因为 setter 注入发生在构造实例之后。

最新更新