如何在 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);
}
}
我的问题是:在 class "MyFoo" 中创建 MyBar 实例的正确方法是什么?只是这样做感觉不对:
public class MyFoo implements Foo {
Bar doSomething() {
MyBar mybar = new MyBar();
return mybar;
}
}
有没有办法在我需要时通过 MyModule 注入一个新的 MyBar 实例,或者我是否必须在 MyBar 的构造函数中注入一个工厂来创建 MyBar 实例?
如果我必须使用工厂,我可以控制通过模块生成哪个实现吗?
您可以使用 Setter 或构造函数 Injection ,如下所示:
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
which can not be instantiated ,你必须为其提供具体的实现,然后绑定你的 Module
并通过Setter 或如上所述的构造函数注入。
Setter 注入示例:
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;
}
}
也许您正在寻找供应商?提供商或多或少是工厂,它们是 Guice API 的一部分,因此您不必实施它们。
public class MyFoo implements Foo {
@Inject Provider<MyBar> myBarProvider;
Bar doSomething() {
return myBarProvider.get(); // returns a new instance of MyBar
}
}
我是 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);
}
}
我的问题是:在 class "MyFoo" 中创建 MyBar 实例的正确方法是什么?只是这样做感觉不对:
public class MyFoo implements Foo {
Bar doSomething() {
MyBar mybar = new MyBar();
return mybar;
}
}
有没有办法在我需要时通过 MyModule 注入一个新的 MyBar 实例,或者我是否必须在 MyBar 的构造函数中注入一个工厂来创建 MyBar 实例? 如果我必须使用工厂,我可以控制通过模块生成哪个实现吗?
您可以使用 Setter 或构造函数 Injection ,如下所示:
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
which can not be instantiated ,你必须为其提供具体的实现,然后绑定你的 Module
并通过Setter 或如上所述的构造函数注入。
Setter 注入示例:
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;
}
}
也许您正在寻找供应商?提供商或多或少是工厂,它们是 Guice API 的一部分,因此您不必实施它们。
public class MyFoo implements Foo {
@Inject Provider<MyBar> myBarProvider;
Bar doSomething() {
return myBarProvider.get(); // returns a new instance of MyBar
}
}