我们试着用Guice重构一个项目。这样做的目的是将所有语言接口绑定到像法语或波兰语这样的组合对象上。
我们有一个绑定模块:
public class StandardModule extends AbstractModule {
@Override
protected void configure() {
bind(Language.class).to(Polish.class);
}
}
以及使用该注入对象的类(AboutDialog.java):
@Inject Language language;
public AboutDialog(JFrame parent) {
super(parent, "", true);
this.language=language;
this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));
this.parent = parent;
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
pack();
}
结果是:
java.lang.NullPointerException at net.sf.jmoney.gui.AboutDialog.<init>(AboutDialog.java:67)
第67行是:
this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));
我们的接口是:
public interface Language {
public ResourceBundle getLanguageInUse();
}
波兰班是:
public class Polish implements Language {
private ResourceBundle languageInUse;
public Polish() {
languageInUse = ResourceBundle.getBundle(Constants.LANGUAGE_PL);
}
public ResourceBundle getLanguageInUse() {
return languageInUse;
}
}
我们迷路了。
发布于 2012-11-08 13:46:05
我假设您的AboutDialog
不是在Guice的帮助下创建的。
您可以做的是使用injector.injectMembers(this)
,其中this
是AboutDialog
。
最好的方法是,AboutDialog
将由Guice创建,因此所有成员都将被注入。
发布于 2012-11-08 19:21:36
你用的是“现场注射”。这将使您很难在构造函数中使用注入的值;即使Guice要创建对象(现在不是这样),或者使用injector.injectMembers(aboutDialog)
,构造函数也会在注入器有机会注入您想要的字段之前运行。
创建一个接受不同参数和注入参数的类要复杂一些。这给您留下了几个选择:
bind(JFrame.class).toInstance(myJFrame);
即可。然后Guice可以完全创建AboutDialog。AboutDialog.Factory
,只需调用create
来获取AboutDialog
。看起来会是这样的:
公共类AboutDialog扩展了JDialog { /**可注入工厂。*/公共静态类工厂{@注入私有语言语言;公共AboutDialog创建(JFrame父){返回新AboutDialog(父级,语言);} //无@注入参数;您在上面调用“新”您自己!公共AboutDialog(JFrame父语言,语言){超级(父,“,真);this.language = language;// .其他初始化}正如问题注释中所指出的,确保您正在获取AboutDialog
(或AboutDialog.Factory
通过@Inject
ed构造函数/字段或从Injector
本身获得),否则Guice将不知道注入参数。
https://stackoverflow.com/questions/13298128
复制相似问题