Java Guice:正确注入工厂生成的实例

Java Guice:正确注入工厂生成的实例,java,groovy,dependency-injection,guice,Java,Groovy,Dependency Injection,Guice,我在Groovy项目中使用Guice 3.0,遇到了奇怪/意外的注入行为。我的主要/引导类: class WidgetServicePerfTester { @Inject WidgetGenerator widgetGenerator static main(args) { Injector injector = Guice.createInjector(new WidgetServicePerfTesterModule()) Widg

我在Groovy项目中使用Guice 3.0,遇到了奇怪/意外的注入行为。我的主要/引导类:

class WidgetServicePerfTester {
    @Inject
    WidgetGenerator widgetGenerator

    static main(args) {
        Injector injector = Guice.createInjector(new WidgetServicePerfTesterModule())
        WidgetServicePerfTester perfTester = injector.getInstance(WidgetServicePerfTester)

        perfTester.run()
    }

    void run() {
        List<Widget> widgets = widgetGenerator.generateWidgets()
        widgets.each {
            it.doStuff()
        }
    }
}
我的POJO生成器(API+impl):


当我运行这段代码时,会出现空指针异常,因为注入每个
小部件的
WidgetClient
为空为什么以及解决方法是什么?

整个问题从
WidgetServicePerfTesterModule
类的以下代码块开始:

@Provides
public WidgetGenerator provideSimpleWidgetGenerator() {
    new SimpleWidgetGenerator(50)
}
使用此构造函数创建
SimpleWidgetGenerator
的实例:

SimpleWidgetGenerator(int numWidgets) {
    super()
    this.numWidgets = numWidgets
}
由于此对象是手动创建的,因此将
WidgetClient
注入
SimpleWidgetGenerator
将不起作用-它是空的,可以解释

要解决此问题,应使用guice assistedinject
,并创建小部件工厂。您可以找到使用上述扩展的重构项目。一切正常


现在清楚了吗?

没有定义
WidgetClient
SimpleWidgetClient
。还有
东西
。你能提供实现吗?谢谢@Opal(+1)-所以我想我正在寻找一个很好的指南来使用
guice-assistedinject
。这个解决方案是可行的,但我在一百万年内都猜不到。这里的经验法则是什么?何时应使用FactoryModuleBuilder?它解决了什么问题?再次感谢<代码>FactoryModuleBuilder当您需要创建包含用
@Inject
注释的字段以及无法注入的字段的对象时,应使用它-例如,DB中的学生姓名。然后使用辅助注入,您既可以传递构造函数参数,也可以进行字段注入。这似乎就是你在这里需要的。如果问题已经解决,请接受答案。抱歉@Opal你在这里帮了这么大的忙(+2表示最后2条评论),我并不想取消绿色检查,但关于你的代码,只有最后一条我仍然没有遵守。您的
WidgetFactory
impl在哪里?它是如何注入的?
WidgetFactory
是由guice本身实现的,您只需要定义工厂方法并使用以下语句安装工厂
install(new-FactoryModuleBuilder().build(WidgetFactory))
。这就是全部。
class WidgetServicePerfTesterModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(WidgetClient).to(SimpleWidgetClient)
    }

    @Provides
    public WidgetGenerator provideSimpleWidgetGenerator() {
        new SimpleWidgetGenerator(50)
    }
}
@Provides
public WidgetGenerator provideSimpleWidgetGenerator() {
    new SimpleWidgetGenerator(50)
}
SimpleWidgetGenerator(int numWidgets) {
    super()
    this.numWidgets = numWidgets
}