Binding Guice-为每个实例的字符串变量注入不同的值
使用Guice,我想为我的颜色类创建三个不同的实例,即蓝色、红色、黄色,并希望绑定不同的颜色值。。。但我不明白如何绑定每个实例的不同值 对于下面的示例代码,如果您看到的话,我希望通过将不同的颜色作为字符串变量传递,对所有三种颜色实例(命名为“蓝色”、“红色”、“橙色”)使用相同的ColorClass实现Binding Guice-为每个实例的字符串变量注入不同的值,binding,guice,multiple-instances,code-injection,Binding,Guice,Multiple Instances,Code Injection,使用Guice,我想为我的颜色类创建三个不同的实例,即蓝色、红色、黄色,并希望绑定不同的颜色值。。。但我不明白如何绑定每个实例的不同值 对于下面的示例代码,如果您看到的话,我希望通过将不同的颜色作为字符串变量传递,对所有三种颜色实例(命名为“蓝色”、“红色”、“橙色”)使用相同的ColorClass实现 public interface ColorInterface { public String getMeColor() } 示例实现 public class ColorClass
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);
......
}
}
请帮助我…如果这直接是您的问题,我建议在实现中稍作更改,将注入的
@Named(“color”)字符串
移动到构造函数参数中,并使用自定义提供程序
:
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);
}
}
}
显然,Provider
不需要像我在那里做的那样是一个静态的内部类,只是在同一个包中
如果这个确切的问题不是你真正的问题,你真的需要以不同的方式注入@Named(“color”)String
(比如说,你实际上已经有了一些非常深层的嵌套结构,需要在层次结构的深层进行不同的绑定,并且不能轻松地将其重构为构造函数参数),那你就需要使用
然而,对于您介绍的案例来说,这种技巧是远远超出了要求的,所以我不太愿意在这里深入讨论。这确实是一个相当高级的话题,除非你真的需要解决它解决的问题,否则你不应该尝试去解决。(这个问题有时被称为“机器人手臂”问题)谢谢丹尼尔。这是解决我的问题的正确方法problem@rock如果你喜欢这个解决方案,你能接受这个答案吗?如果它解决了你的问题,请考虑接受解决方案。谢谢
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"));
}
}