我正在努力学习Guice,我对如何正确连接东西有疑问。我试图在BoofPanels doSomething()方法中调用以自动使用MockFooImpl,但我认为没有正确连接。
就我而言,我有:
@ImplementedBy(MockFooImpl.class)
public interface FooInterface {
public int getBar(String one, String two);
}
@Singleton
public final class MockFooImpl implements FooInterface {
@Inject
public MockFooImpl() {
}
@Override
public int getBar(String one, String two) {
return 1;
}
}
public class Baz extends JFrame {
private BoofPanel boofPanel;
public Baz(String one, String two, Injector injector){
// Constructor with args
boofPanel = new BoofPanel("aString", 565);
injector.injectMembers(boofPanel);
}
public static void main(String[] args){
final Injector injector = Guice.createInjector();
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final Baz baz = new Baz("one","two", injector);
baz.setVisible(true);
}
});
}
}
public class BoofPanel extends JPanel {
@Inject
private FooInterface fooI;
public BoofPanel(String aString, int anInt){
}
public void doSomething(){
fooI.getBar();
}
}
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:2)
Guice不是魔法。它只会注入一个对象,如果它创建它,或者你要求它。如果你正在创建自己的BoofPanel,那么你需要让Guice注入它。向Baz添加一个构造函数,如下所示:
public Baz(Injector injector) {
boofPanel = new BoofPanel(whatever, the, params, are);
injector.injectMembers(boofPanel);
}
BoofPanel构造函数不需要对fooI变量做任何事情;它可以留空。您还需要将main的注入器变量设为final,因此在main中创建的匿名类可以捕获它并将其传递给Baz构造函数。
如果你想让Guice创建BoofPanel,那么你需要向Guice提供它需要的所有构造函数参数,并在Baz上调用injectMembers。
编辑:编辑后对上述代码的具体更改。
在此声明中添加final
,以使其在匿名内部类中可用:
final Injector injector = Guice.createInjector();
删除此行,因为它是不必要的:
injector.getInstance(MockFooImpl.class);
将注入器添加到Baz构造函数的调用中,以使其到达创建BoofPanel的位置(我还删除了此处不必要的final
):
Baz baz = new Baz("one", "two", injector);
将注入器添加到Baz构造函数的声明中,以从main方法接收它:
public Baz(String one, String two, Injector injector) {
在new BoofPanel
行后面的boofPanel中添加注入到Baz构造函数,以使Guice注入BoofPanel:
injector.injectMembers(boofPanel);
就是这样。
答案 1 :(得分:1)
你可能想要
public class BoofPanel extends JPanel {
private FooInterface fooI;
@Inject BoofPanel(FooInterface foo) {
this.fooI = foo;
}
public void doSomething() {
fooI.getBar();
}
}
然后在您的主要内容中,您可能需要injector.createInstance(BoofPanel.class)
这样的内容,它会自动满足FooInterface
的{{1}}要求。