Java 使用Guice注入Swing组件的最佳实践?
我正在使用GoogleGuice作为IOC容器开发一个JavaSwing应用程序。我直接注入组件,但这让Guice可以在EDT之外创建组件 应用程序看起来有点像这样:Java 使用Guice注入Swing组件的最佳实践?,java,swing,user-interface,dependency-injection,guice,Java,Swing,User Interface,Dependency Injection,Guice,我正在使用GoogleGuice作为IOC容器开发一个JavaSwing应用程序。我直接注入组件,但这让Guice可以在EDT之外创建组件 应用程序看起来有点像这样: private Panel1 panel1; private Panel2 panel2; @Inject public class Application(Panel1 panel1, Panel2 panel2) { this.panel1 = panel1; this.panel2 = panel2; }
private Panel1 panel1;
private Panel2 panel2;
@Inject
public class Application(Panel1 panel1, Panel2 panel2) {
this.panel1 = panel1;
this.panel2 = panel2;
}
看着这些问题,我得出的结论是注入一个加载程序,而不是直接注入一个组件
private PanelLoader1 loader1;
private PanelLoader2 loader2;
private Panel1 panel1;
private Panel2 panel2;
@Inject
public class Application(PanelLoader1 loader1, PanelLoader2 loader2) {
this.loader1 = loader1;
this.loader2 = loader2;
loader1.load();
loader2.load();
this.panel1 = loader1.get();
this.panel2 = loader2.get();
}
public class PanelLoader {
private Panel panel;
public void load() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
panel = new Panel();
}
});
}
public Panel get() {
return panel;
}
}
这是正确的吗?有没有这样做的最佳实践?如果你想使用“加载器”,你应该实现
com.google.inject.Provider
。请看下面的示例
您不需要注入提供者本身,您可以配置模块来注入提供者创建的对象:
public class PanelModule extends AbstractModule {
@Override
protected void configure() {
bind(Panel1.class).toProvider(Panel1Provider.class);
}
private static class Panel1Provider implements Provider<Panel1> {
private Panel1 panel1;
@Override
public Panel1 get() {
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
panel1 = new Panel1();
}
});
} catch (InvocationTargetException e) {
throw new RuntimeException(e); // should not happen
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
return panel1;
}
public class PanelModule extends AbstractModule {
Panel1 panel1;
Panel2 panel2;
@Override
protected void configure() {
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
panel1 = new Panel1();
panel2 = new Panel2();
}
});
} catch (InvocationTargetException e) {
throw new RuntimeException(e); // should not happen
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
bind(Panel1.class).toInstance(panel1);
bind(Panel2.class).toInstance(panel2);
}