Java 关于如何正确连接对象的Guice示例
我正在努力学习Guice,我有一个关于如何正确连接事物的问题。我正在尝试调用BoofPanels doSomething()方法来自动使用MockFooImpl,但我认为事情并没有正确连接 就我而言,我有:Java 关于如何正确连接对象的Guice示例,java,guice,Java,Guice,我正在努力学习Guice,我有一个关于如何正确连接事物的问题。我正在尝试调用BoofPanels doSomething()方法来自动使用MockFooImpl,但我认为事情并没有正确连接 就我而言,我有: @ImplementedBy(MockFooImpl.class) public interface FooInterface { public int getBar(String one, String two); } @Singleton public final class
@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();
}
}
任何帮助都将不胜感激
谢谢 你可能想要
public class BoofPanel extends JPanel {
private FooInterface fooI;
@Inject BoofPanel(FooInterface foo) {
this.fooI = foo;
}
public void doSomething() {
fooI.getBar();
}
}
然后,在您的主要应用程序中,您可能需要类似于injector.createInstance(BoofPanel.class)
的东西,它将通过您可能需要的MockFooImpl
自动满足FooInterface
要求
public class BoofPanel extends JPanel {
private FooInterface fooI;
@Inject BoofPanel(FooInterface foo) {
this.fooI = foo;
}
public void doSomething() {
fooI.getBar();
}
}
然后,在您的主要应用程序中,您可能需要类似于
injector.createInstance(BoofPanel.class)
的东西,它将通过MockFooImpl
自动满足FooInterface
的要求。只有当它创建对象或您要求它创建对象时,它才会注入到对象中。如果您正在创建自己的BoofPanel,那么您需要让Guice注入它。向Baz添加一个构造函数,该构造函数如下所示:
public Baz(Injector injector) {
boofPanel = new BoofPanel(whatever, the, params, are);
injector.injectMembers(boofPanel);
}
BoofPanel构造函数不需要对fooI变量执行任何操作;它可以将其保留为空。您还需要将main的injector变量设为final,以便在main中创建的匿名类可以捕获它并将其传递给Baz构造函数
如果希望BoofPanel由Guice创建,那么需要向Guice提供它所需的所有构造函数参数,并在Baz本身上调用injectMembers
编辑:编辑后对上述代码的特定更改
final
,使其在匿名内部类中可用:
final Injector=Guice.createInjector()代码>
injector.getInstance(MockFooImpl.class)代码>
final
):
Baz-Baz=新的Baz(“一个”、“两个”,注入器)代码>
public Baz(串一、串二、注入器){
新boofPanel
行之后,将注入boofPanel添加到Baz构造函数中,以使Guice注入boofPanel:
injector.injectMembers(boofPanel);
就是这样。Guice不是魔法。它只会在对象创建或您要求时注入到对象中。如果您正在创建自己的BoofPanel,那么您需要让Guice注入它。向Baz添加一个构造函数,如下所示:
public Baz(Injector injector) {
boofPanel = new BoofPanel(whatever, the, params, are);
injector.injectMembers(boofPanel);
}
BoofPanel构造函数不需要对fooI变量做任何事情;它可以将其保留为null。您还需要将main的injector变量设置为final,以便在main中创建的匿名类可以捕获它并将其传递给Baz构造函数
如果希望BoofPanel由Guice创建,那么需要向Guice提供它所需的所有构造函数参数,并在Baz本身上调用injectMembers
编辑:编辑后对上述代码的特定更改
final
,使其在匿名内部类中可用:
final Injector=Guice.createInjector();
injector.getInstance(MockFooImpl.class);
final
):
Baz-Baz=新的Baz(“一个”、“两个”喷油器);
public Baz(串一、串二、注入器){
新boofPanel
行之后,将注入boofPanel添加到Baz构造函数中,以使Guice注入boofPanel:
injector.injectMembers(boofPanel);
就这样。如果我已经有了BoofPanel的构造函数,它有其他参数,并且是从Baz调用的,那该怎么办?我是否只需要添加一个“foo接口foo”如果
Baz
以任何方式、形状或形式调用new BoofPanel
,Guice都不会做任何注入。关于我对你帖子的明显编辑:我本想编辑我的,但编辑错了。现在修复了。O拥有编辑权限并在喝咖啡之前使用这些权限的危险之一。抱歉。如果我已经有了BoofPanel的构造函数,该构造函数具有其他参数,并且是从Baz调用的,该怎么办?我只是添加了一个“FooInterface foo”吗如果Baz
以任何方式、形状或形式调用new BoofPanel
,Guice都不会做任何注入。关于我对你帖子的明显编辑:我本想编辑我的,但编辑错了。现在修复了。O拥有编辑权限,并在喝咖啡之前使用它们的危险之一。抱歉。不幸的是,我的Baz也有构造函数参数,因此它必须经历与BoofPanel相同的事情。这似乎会变得混乱,更难看到原始意图。在第二种情况下,如何提供所有构造函数参数将uctor参数转换为Juice?Baz有其他构造函数参数没有问题。只要它能得到一个注入器(甚至可以自己创建一个注入器),它可以注入子对象。要使其他参数对Guice可用,您必须为它们提供绑定,可以使用@ImplementedBy,也可以通过在模块中显式绑定它们。