关于如何正确连接对象的Guice示例

时间:2012-02-16 15:33:22

标签: java guice

我正在努力学习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();
    }
}

任何帮助都将不胜感激。

谢谢!

2 个答案:

答案 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。

编辑:编辑后对上述代码的具体更改。

  1. 在此声明中添加final,以使其在匿​​名内部类中可用:

    final Injector injector = Guice.createInjector();

  2. 删除此行,因为它是不必要的:

    injector.getInstance(MockFooImpl.class);

  3. 将注入器添加到Baz构造函数的调用中,以使其到达创建BoofPanel的位置(我还删除了此处不必要的final):

    Baz baz = new Baz("one", "two", injector);

  4. 将注入器添加到Baz构造函数的声明中,以从main方法接收它:

    public Baz(String one, String two, Injector injector) {

  5. new BoofPanel行后面的boofPanel中添加注入到Baz构造函数,以使Guice注入BoofPanel:

    injector.injectMembers(boofPanel);

  6. 就是这样。

答案 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}}要求。