我在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。 为什么以及解决了什么?
答案 0 :(得分:3)
整个问题从WidgetServicePerfTesterModule
类开始,在下面的代码块中:
@Provides
public WidgetGenerator provideSimpleWidgetGenerator() {
new SimpleWidgetGenerator(50)
}
使用此构造函数创建SimpleWidgetGenerator
的实例:
SimpleWidgetGenerator(int numWidgets) {
super()
this.numWidgets = numWidgets
}
并且由于此对象是手动创建的,因此将WidgetClient
注入SimpleWidgetGenerator
将无法正常工作 - 它为空并且可以解释。
要解决问题,应使用guice-assistedinject
并创建Widgets的工厂。 Here您可以使用上述扩展找到重构项目。一切正常。
现在清楚了吗?