Guice 字段注入

Guice field injection

事情是这样的。我试图用 guice 注入一些字段,但事实证明它们总是空的(不试图在构造函数上使用它们)。

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);
}

但这很丑陋,不清楚,有很多样板,我不得不在很多地方做这件事,这很乏味。

还有其他方法可以存档吗?或者解释为什么没有注入该字段?

谢谢

注意: 我目前无法在构造函数(使用 bar 作为参数)上进行 propper 注入,因为它意味着重构。该项目目前正在大量生产中,因此目前无法进行此类重构。

IOC 容器只控制您告诉它控制的内容。它不知道 B 内部的 A,因为它是直接构建的,而不是由容器管理的。您还需要 inject A

public class B {
    @inject private A a;

    public B() {}

    ...
}

你也不能只调用 new B(),你还需要注入 B