无法在 javafx 项目中注入依赖项
cannot inject a dependency in a javafx project
我正在尝试在 javaFX 项目中进行依赖注入。
我有一个
@Singleton
public class WidgetFactory implements IWidgetFactory
我的public class ZentaEditorModule extends MvcFxModule
包含
@Override
protected void configure() {
super.configure();
//some other code
System.out.println("binding WidgetFactory");
bind(IWidgetFactory.class).to(WidgetFactory.class);
}
在我的 public class ZentaApplication extends Application
我有这个, 运行 在应用程序初始化中:
final Injector injector = Guice.createInjector(module);
System.out.printf(
"widgetFactory=%s\n", injector.getInstance(IWidgetFactory.class)
);
domainHandler = new DomainHandler(injector, editorModel);
DomainHandler 是这样开始的:
public class DomainHandler {
@Inject
private IWidgetFactory widgetFactory;
@Inject
private Injector injector;
public DomainHandler(
final Injector injector, final EditorModelItem editorModelItem
) {
System.out.printf(
"injector in domainHandler=%s\n",
injector
);
System.out.printf(
"injector2 in domainHandler=%s\n",
getInjector(null)
);
System.out.printf(
"widgetFactory in domainHandler=%s\n",
widgetFactory
);
System.out.printf(
"injector parameter=%s\n",
this.injector
);
}
@Inject
public Injector getInjector(final Injector injector) {
return injector;
}
}
我得到了这个:
binding WidgetFactory
widgetFactory=org.rulez.demokracia.zenta3.editor.widgets.WidgetFactory@39957a81
injector in domainHandler=Injector[bindings=[ProviderInstanceBinding[key=Key[type=com.google.inject.Injector...
injector2 in domainHandler=null
widgetFactory in domainHandler=null
injector parameter=null
DomainHandler constructor
注入器输出实际上包含这个:
LinkedKeyBinding[key=Key[type=org.rulez.demokracia.zenta3.editor.widgets.IWidgetFactory,
annotation=[none]],
source=org.rulez.demokracia.zenta3.editor.ZentaEditorModule.configure(ZentaEditorModule.java:152),
scope=Scopes.NO_SCOPE,
target=Key[type=org.rulez.demokracia.zenta3.editor.widgets.WidgetFactory,
annotation=[none]]],
由此看来,在 @Inject 注释的 none 处似乎没有任何东西注入到我的 DomainManager 实例中。有趣的是,代码中还有其他 类 也注入了注入器,并且它们正在工作。
所以我想我在初始化时做错了什么。但是什么?
您不是通过 guice 创建域处理程序,因此 @inject 注释什么都不做。如果您想以两种方式创建此对象,只需使用构造函数注入并从您的字段中删除@inject。
@inject
public DomainHandler(Injector injector, WidgetFactory widgetFactory) {
this.injector = injector;
this.widgetFactory = widgetFactory
}
这种方式手动传递它们或使用 getInstance 将做同样的事情。
@inject on getters 没有意义,它可以用于 getters 但即使在文档中也不是通常说的,并且当您从构造函数打印它时将它传递给 null。
我正在尝试在 javaFX 项目中进行依赖注入。
我有一个
@Singleton
public class WidgetFactory implements IWidgetFactory
我的public class ZentaEditorModule extends MvcFxModule
包含
@Override
protected void configure() {
super.configure();
//some other code
System.out.println("binding WidgetFactory");
bind(IWidgetFactory.class).to(WidgetFactory.class);
}
在我的 public class ZentaApplication extends Application
我有这个, 运行 在应用程序初始化中:
final Injector injector = Guice.createInjector(module);
System.out.printf(
"widgetFactory=%s\n", injector.getInstance(IWidgetFactory.class)
);
domainHandler = new DomainHandler(injector, editorModel);
DomainHandler 是这样开始的:
public class DomainHandler {
@Inject
private IWidgetFactory widgetFactory;
@Inject
private Injector injector;
public DomainHandler(
final Injector injector, final EditorModelItem editorModelItem
) {
System.out.printf(
"injector in domainHandler=%s\n",
injector
);
System.out.printf(
"injector2 in domainHandler=%s\n",
getInjector(null)
);
System.out.printf(
"widgetFactory in domainHandler=%s\n",
widgetFactory
);
System.out.printf(
"injector parameter=%s\n",
this.injector
);
}
@Inject
public Injector getInjector(final Injector injector) {
return injector;
}
}
我得到了这个:
binding WidgetFactory
widgetFactory=org.rulez.demokracia.zenta3.editor.widgets.WidgetFactory@39957a81
injector in domainHandler=Injector[bindings=[ProviderInstanceBinding[key=Key[type=com.google.inject.Injector...
injector2 in domainHandler=null
widgetFactory in domainHandler=null
injector parameter=null
DomainHandler constructor
注入器输出实际上包含这个:
LinkedKeyBinding[key=Key[type=org.rulez.demokracia.zenta3.editor.widgets.IWidgetFactory,
annotation=[none]],
source=org.rulez.demokracia.zenta3.editor.ZentaEditorModule.configure(ZentaEditorModule.java:152),
scope=Scopes.NO_SCOPE,
target=Key[type=org.rulez.demokracia.zenta3.editor.widgets.WidgetFactory,
annotation=[none]]],
由此看来,在 @Inject 注释的 none 处似乎没有任何东西注入到我的 DomainManager 实例中。有趣的是,代码中还有其他 类 也注入了注入器,并且它们正在工作。 所以我想我在初始化时做错了什么。但是什么?
您不是通过 guice 创建域处理程序,因此 @inject 注释什么都不做。如果您想以两种方式创建此对象,只需使用构造函数注入并从您的字段中删除@inject。
@inject
public DomainHandler(Injector injector, WidgetFactory widgetFactory) {
this.injector = injector;
this.widgetFactory = widgetFactory
}
这种方式手动传递它们或使用 getInstance 将做同样的事情。
@inject on getters 没有意义,它可以用于 getters 但即使在文档中也不是通常说的,并且当您从构造函数打印它时将它传递给 null。