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

Guice: injecting factory-generated instances properly

我在一个 Groovy 项目上使用 Guice 3.0,并且正在 运行 加入 bizarre/unexpected 注入行为。我的 main/bootstrapping class:

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:

class Widget extends Thingy {
    WidgetClient widgetClient

    int numFoos

    @Override
    void doStuff() {
        widgetClient.doSomethingOnServer()
    }
}

我的 POJO 生成器(API + impl):

interface WidgetGenerator {
    List<Widget> generateWidgets()
}

class SimpleWidgetGenerator implements WidgetGenerator {
    @Inject
    WidgetClient widgetClient

    int numWidgets

    SimpleWidgetGenerator() {
        super()
    }

    SimpleWidgetGenerator(int numWidgets) {
        super()

        this.numWidgets = numWidgets
    }

    @Override
    List<Widget> generateWidgets() {
        List<Widget> widgets = []

        Widget firstWidget = new Widget(widgetClient: widgetClient, numFoos: getRandomNumber())
        widgets.add(firstWidget)

        // Code that populates the rest of 'widgets' with 'numWidgets' number of Widgets.
    }
}

我的 Guice 模块:

class WidgetServicePerfTesterModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(WidgetClient).to(SimpleWidgetClient)
    }

    @Provides
    public WidgetGenerator provideSimpleWidgetGenerator() {
        new SimpleWidgetGenerator(50)
    }
}

当我 运行 这段代码时,我得到空指针异常,因为注入每个 WidgetWidgetClient 是 NULL。 为什么以及什么是修复?

整个问题从这里开始 WidgetServicePerfTesterModule class,在下面的代码块中:

@Provides
public WidgetGenerator provideSimpleWidgetGenerator() {
    new SimpleWidgetGenerator(50)
}

使用此构造函数创建 SimpleWidgetGenerator 的实例:

SimpleWidgetGenerator(int numWidgets) {
    super()
    this.numWidgets = numWidgets
}

并且由于此对象是手动创建的,因此将 WidgetClient 注入 SimpleWidgetGenerator 将不起作用 - 它为空且可解释。

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

现在清楚了吗?