吉斯。注入构造函数

时间:2016-02-19 15:30:54

标签: java dependency-injection guice

我有一个单身人士:

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的原因是什么?是否因为它是构造函数或因为它是单例而发生?

2 个答案:

答案 0 :(得分:2)

调用MySingleton的构造函数时,instance为空。 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();
  }
}

答案 1 :(得分:1)

在这种情况下,

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

很快,在调用构造函数MySingleton()之后应调用doSmth()方法,因为在构造实例后会发生setter注入。