Guice现场注射

时间:2018-04-21 13:04:51

标签: java dependency-injection guice

所以这就是事情。我试图用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作为参数),因为它意味着重构。该项目现在正在大量生产,因此这种重构现在无法完成。

1 个答案:

答案 0 :(得分:2)

IOC容器仅控制您要控制的内容。它不知道A内的B,因为它是直接构造的,不是由容器管理的。您还需要inject A

public class B {
    @inject private A a;

    public B() {}

    ...
}

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