【问题标题】:Guice field injection not working (returns null)Guice 字段注入不起作用(返回 null)
【发布时间】:2017-10-06 14:17:03
【问题描述】:

我在使用 Guice 时遇到了空值问题。接下来,我将向您展示一个类似场景的示例。 我知道现场注入是一种不好的做法,但我希望它在演示中像这样工作

我有一个名为 B 的具体类(这是我要注入的类):

class B{

    @Inject
    public B(){}

    public void fooMethod(){
        System.out.println("foo!")
    }
}

我有一个名为A的抽象类,它有一个类B(我想通过字段注入来注入的那个):

abstract class A{

    @Inject
    protected B b;

}

现在是另一个名为 C 的具体类,它扩展了 A

class C extends A{

    public void barMethod(){
        System.out.println("is b null? " + (b==null)); // is true
    }
}

我的guice配置如下:

class ConfigModule extends AbstractModule {

    @Override
    protected void configure(){
        // bind(B.class) // I have also tried this
    }

    @Provides
    B getB(){
        return new B();
    }

    @Provides
    C getC(){
        return new C();
    }
}

然后我用 Spock 做一个测试:

@UseModules(ConfigModule)
class Test extends Specification{

    @Inject
    public C c;

    def "test"() {
        // Here goes the test using:
        c.barMethod();
    }       
}

谢谢:)

【问题讨论】:

  • 你是如何创建C的?
  • 您的 ConfigModule 看起来是无关紧要的,可以使用 B 的 @Inject 构造函数删除。如果 B 是必需的但不受约束,Guice 不会安静地失败,所以要同意 Tavian,这真的归结为你如何从 Guice 获得 C。我会假设通过@Providesnew C() 的方法,或者完全排除 Guice 的方法。
  • 大家好,我已经更新了这个问题的更多细节,就像编辑一样

标签: java testing dependency-injection frameworks guice


【解决方案1】:

这就是让你失望的原因:

@Provides
C getC(){
    return new C();
}

删除它。删除整个模块,事实上——你定义的方法都没有帮助你的注入。


当您创建 @Provides C 方法时,Guice 假定您正在按照您喜欢的方式创建 C,并且不会填充 @Inject-annotated 字段或调用 @Inject-annotated 方法。但是,当 C 具有 @Inject-annotated 或公共无参数构造函数时,Guice 将检查该对象并根据其 @Inject 字段和方法创建它,这是您正在寻找的行为。

【讨论】:

  • 感谢@Jeff Bowman!您知道任何资源来了解有关 Guice 的更多信息吗?这很有趣,但我发现它很难......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多