簡體   English   中英

如何在Google Guice中創建實現的實例

[英]How to create an instance of an implementation in Google Guice

我是Google Guice的新手,需要一點幫助。 我創建了一個像這樣的模塊:

public interface Foo {
  Bar doSomething();
}

public class MyFoo implements Foo {
  Bar doSomething() {
    // create an instance of MyBar
  }
}

public interface Bar {
  void run();
}

public interface MyBar implements Bar {
  void run();
}

public class MyModule extends AbstractModule {

  @Override
  protected void configure() {
    bind(Foo.class).to(MyFoo.class);
  }      
}

我的問題是:在類“ MyFoo”中創建MyBar實例的正確方法是什么? 只是這樣做是錯誤的:

public class MyFoo implements Foo {
  Bar doSomething() {
    MyBar mybar = new MyBar();
    return mybar;
  }
}

是否可以在需要時通過MyModule注入MyBar的新實例,還是必須在MyBar的構造函數中注入工廠才能創建MyBar實例? 如果必須使用工廠,是否可以控制通過模塊生成的實現?

也許您在尋找供應商? 提供者或多或少是Guice API的一部分的工廠,因此您不必實現它們。

public class MyFoo implements Foo {
  @Inject Provider<MyBar> myBarProvider;

  Bar doSomething() {
    return myBarProvider.get(); // returns a new instance of MyBar
  }
}

有關詳細信息,請參見https://github.com/google/guice/wiki/InjectingProviders

您可以使用Setter或Constructor 注入,如下所示:

public class MyFoo implements Foo {

    //constructor based injector
    @Inject
    public MyFoo(MyBar myBar){
        this.myBar=myBar;
    }

     //setter method injector
    @Inject
    public void setBar(MyBar myBar){
        this.myBar=myBar;
    }

    Bar doSomething() {
    // create an instance of MyBar
  }
}

MyBar無法實例化Interface ,您必須為其提供具體的實現,然后綁定到Module並通過如上所述的Setter或Constructor Injection注入它。

二傳手注射示例:

MyModule.java

import com.google.inject.AbstractModule;

public class MyModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Foo.class).to(MyFoo.class);
        bind(Bar.class).to(MyBar.class);
    }
}

MyBar.java

public class MyBar implements Bar {

    public void run() {
        System.out.println("Hello Bar");
    }
}

MyFoo.java

import com.google.inject.Inject;

public class MyFoo implements Foo {
    private Bar bar;

    // setter method injector
    @Inject
    public void setBar(Bar myBar) {
        this.bar = myBar;
    }

    public Bar doSomething() {
        return bar;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM