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