[英]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.