Java 磁场注入

Java 磁场注入,java,dependency-injection,guice,Java,Dependency Injection,Guice,事情是这样的。我试图用guice注入一些字段,但结果证明它们总是空的(不尝试在构造函数上使用它们) 现在,每当应用程序执行someOtherMethod并尝试运行bar.doth时,就会引发一个很好的NullPointerException 因此,为了解决这个问题,我结束了在构造函数中手动注入字段: public A() { final Injector injector = Guice.createInjector(); bar = injector.getInstance(S

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

现在,每当应用程序执行someOtherMethod并尝试运行bar.doth时,就会引发一个很好的NullPointerException

因此,为了解决这个问题,我结束了在构造函数中手动注入字段:

public A() {
    final Injector injector = Guice.createInjector();
    bar = injector.getInstance(SomeClass.class);
}
但这是丑陋的,不清楚的,有很多样板,我被迫在许多地方这样做,这使它乏味

有没有其他方法来存档?或者解释为什么没有注入磁场

谢谢

注:
我目前无法在构造函数上执行propper注入(使用bar作为参数),因为这意味着重构。该项目目前正处于繁重的生产阶段,因此目前无法进行此类重构。

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

public class B {
    @inject private A a;

    public B() {}

    ...
}

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

那么guice基本上是病毒性的?为了让它工作,我必须注入所有东西?大多数DI系统都是“病毒性”的,我更愿意把它看作是通过整个堆栈强制控制反转。还有其他方法,比如注入提供者,或者您发现手动询问容器:
injector.getInstance(SomeClass.class)
谢谢您的回答。他们很有帮助。注射不是“机器上的东西”。对于使用经典“新建”创建的对象,不会出现(可能会出现少量添加或路径)
public class B {
    @inject private A a;

    public B() {}

    ...
}