使用Guice,我想为我的Color类创建三个不同的实例,即BLUE,RED,YELLOW,并希望绑定不同的颜色值......但我不了解如何为每个实例绑定不同的值...
对于下面的示例代码,如果你看到,我想通过将不同的颜色作为String变量传递给所有三种颜色实例(命名为“BLUE”,“RED”,“ORANGE”)使用相同的ColorClass实现。 / p>
public interface ColorInterface {
public String getMeColor()
}
示例实施....
public class ColorClass implements ColorInterface {
@Inject @Named("color")
String color
public String getMeColor(){
return color
}
}
样品装订........
public class ColorModule extends AbstractModule {
@Override
protected void configure() {
bind(ColorInterface.class).annotatedWith(Names.named("BLUE")).to(ColorClass.class);
bind(ColorInterface.class).annotatedWith(Names.named("RED")).to(ColorClass.class);
bind(ColorInterface.class).annotatedWith(Names.named("ORANGE")).to(ColorClass.class);
......
}
}
请帮帮我......
答案 0 :(得分:3)
如果这直接是你的问题,我建议稍微改变实现,将注入的@Named("color") String
移动到构造函数参数中并使用自定义Provider
:
public class ColorClass implements ColorInterface {
String color;
ColorClass(String color) {
this.color = color;
}
public String getMeColor(){
return color;
}
public static Provider implements Provider<ColorClass> {
String color;
public Provider(String color) {
this.color = color;
}
public ColorClass get() {
return new ColorClass(color);
}
}
}
然后在你的模块中:
public class ColorModule extends AbstractModule {
@Override
protected void configure() {
bind(ColorInterface.class).annotatedWith(Names.named("BLUE"))
.toProvider(new ColorClass.Provider("Blue"));
bind(ColorInterface.class).annotatedWith(Names.named("RED"))
.toProvider(new ColorClass.Provider("Red"));
bind(ColorInterface.class).annotatedWith(Names.named("ORANGE"))
.toProvider(new ColorClass.Provider("Orange"));
}
}
显然,Provider
不需要像我那样做一个静态的内部类,只需要在同一个包中。
如果这个确切的问题确实不是你的问题而且你确实需要@Named("color") String
进行不同的注入(比如说,你实际上有一些非常深的嵌套结构与guice一起使用并需要一个不同的绑定在层次结构的深处,并且不能轻易地将其重构为构造函数参数),那么您将需要使用private modules。
然而,对于你提出的案例,这种技术范围过大,所以我在这里犹豫不决。除非你真的需要解决它解决的问题,否则你不应该尝试解决这个相当高级的话题。 (问题有时被称为“机器人武器”问题)