吉斯。注入构造函数
Guice. Inject into constructor
我有一个单身人士:
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 有一个单例的概念:要么在模块的单例范围内绑定 class,要么将 class 注释为 @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 class 的一个实例需要是 created/constructed 才能使用 anotherClassInst_BlaBla.
很快,您应该在调用构造函数 MySingleton() 之后调用 doSmth() 方法,因为 setter 注入发生在构造实例之后。
我有一个单身人士:
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 有一个单例的概念:要么在模块的单例范围内绑定 class,要么将 class 注释为 @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 class 的一个实例需要是 created/constructed 才能使用 anotherClassInst_BlaBla.
很快,您应该在调用构造函数 MySingleton() 之后调用 doSmth() 方法,因为 setter 注入发生在构造实例之后。