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

时间:2015-01-13 08:54:24

标签: java groovy dependency-injection guice

我在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:

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)
    }
}

当我运行此代码时,我得到空指针异常,因为注入每个WidgetClient的{​​{1}}为NULL。 为什么以及解决了什么?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

并且由于此对象是手动创建的,因此将WidgetClient注入SimpleWidgetGenerator将无法正常工作 - 它为空并且可以解释。

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

现在清楚了吗?