kos*_*otr 7 java inversion-of-control guice
我是Java初学者和IoC.怎么做的东西:
public class Foo{
//private Bar bar; //Bar is an interface
private int var;
public Foo(){
}
public void setVar(int var){
this.var = var;
}
public Bar getBar(){
if(var==1){
return new BarImpl1(); //an implemantation of Bar interface
}
else if(var==2){
return new BarImpl2(); //an implemantation of Bar interface
}
else{
return new BarImpl(); //an implemantation of Bar interface
}
}
}Run Code Online (Sandbox Code Playgroud)
在IoC方式Guice的例子?
public class Foo{
private Bar bar; //Bar is an interface
private int var;
@Inject
public Foo(Bar bar){
this.bar = bar;
}
public void setVar(int var){
this.var = var;
}
public Bar getBar(){
return bar; // or what else??
}
}Run Code Online (Sandbox Code Playgroud)
我该如何配置我的注射器?
@Override
protected void configure() {
bind(Bar.class).to(BarImpl.class);
//and what else??
}Run Code Online (Sandbox Code Playgroud)
我将假设这var是一个在运行时根据数据、用户输入等确定的代码,并且单个实例Foo必须能够返回Bar取决于该代码的不同实现(它是一个动态Bar工厂)。
在这种情况下,您可能想要做的是使用多绑定扩展中的MapBinder 。
你可能会做这样的事情:
MapBinder<Integer, Bar> mapbinder
= MapBinder.newMapBinder(binder(), Integer.class, Bar.class);
mapbinder.addBinding(1).to(BarImpl1.class);
mapbinder.addBinding(2).to(BarImpl2.class);
bind(Bar.class).to(BarImpl.class); // the fallback
Run Code Online (Sandbox Code Playgroud)
那么Foo可能看起来像:
public class Foo {
private final Provider<Bar> defaultProvider;
private final Map<Integer, Provider<Bar>> barTypeMap;
private int var = -1;
@Inject public Foo(Provider<Bar> defaultProvider,
Map<Integer, Provider<Bar>> barTypeMap) {
this.defaultProvider = defaultProvider;
this.barTypeMap = barTypeMap;
}
public void setVar(int var) { ... }
public Bar getBar() {
if(barTypeMap.containsKey(var)) {
return barTypeMap.get(var).get();
}
return defaultProvider.get();
}
}
Run Code Online (Sandbox Code Playgroud)