Guice - 为每个实例的字符串变量注入不同的值

时间:2015-01-12 00:21:42

标签: binding guice multiple-instances code-injection

使用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);

            ......
    }

}

请帮帮我......

1 个答案:

答案 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

然而,对于你提出的案例,这种技术范围过大,所以我在这里犹豫不决。除非你真的需要解决它解决的问题,否则你不应该尝试解决这个相当高级的话题。 (问题有时被称为“机器人武器”问题)