Java Guice:正确注入工厂生成的实例
我在Groovy项目中使用Guice 3.0,遇到了奇怪/意外的注入行为。我的主要/引导类: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
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
}