所以这就是事情。我试图用guice注入一些字段,但事实证明它们总是为null(不试图在构造函数上使用它们)。
public class A {
@Inject
private SomeClass bar;
public A() {
foo();
}
public someMethod() {
bar.doSth();
}
}
public class B {
private A a;
public B() {
a = new A();
}
public someOtherMethod() {
a.someMethod();
}
}
现在每当应用程序执行someOtherMethod并尝试运行bar.doSth时,就会引发一个漂亮的NullPointerException。
所以为了解决这个问题,我结束了在构造函数中手动注入字段:
public A() {
final Injector injector = Guice.createInjector();
bar = injector.getInstance(SomeClass.class);
}
但这很丑陋,不清楚,有很多样板,我不得不在许多地方做这件事,这使得它变得乏味。
还有其他方法可以存档吗?或解释为什么没有注入该场?
由于
注意: 我目前无法在构造函数上执行propper注入(使用bar作为参数),因为它意味着重构。该项目现在正在大量生产,因此这种重构现在无法完成。
答案 0 :(得分:2)
IOC容器仅控制您要控制的内容。它不知道A
内的B
,因为它是直接构造的,不是由容器管理的。您还需要inject
A
:
public class B {
@inject private A a;
public B() {}
...
}
你也不能只调用new B()
,你也需要注入B
。