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

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

我正在努力学习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();
    }
}
任何帮助都将不胜感激

谢谢

你可能想要

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)

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

    Baz-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);

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

    Baz-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,也可以通过在模块中显式绑定它们。