Java Guice:使用@Named创建对象

Java Guice:使用@Named创建对象,java,dependency-injection,guice,Java,Dependency Injection,Guice,使用Guice,如果我有 @Inject @Named("light") Color light; 我可以用 bind(Color.class).annotatedWith(Names.named("light")) .toInstance(new Color("white")); 若颜色构造函数只需要颜色名称,则将其绑定到白色 但是,如果颜色构造函数也需要由Guice创建的对象,我该怎么做呢?例如: @Inject public Color(ColorSet colorset, S

使用Guice,如果我有

@Inject @Named("light")
Color light;
我可以用

bind(Color.class).annotatedWith(Names.named("light"))
    .toInstance(new Color("white"));
若颜色构造函数只需要颜色名称,则将其绑定到白色

但是,如果颜色构造函数也需要由Guice创建的对象,我该怎么做呢?例如:

@Inject
public Color(ColorSet colorset, String colorName) {...}
其中colorset是由Guice在运行时创建的,在configure(){…}中不可用

我想在没有以下条件的情况下完成:

  • 为我需要注入的每种颜色(如WhiteColor)创建一个类/子类
  • 在我的代码中直接使用反射
  • 将我的类更改为使用
    ColorFactory;工厂。得到(“光”)
    而不是
    @Named(“light”)彩色灯光

您可以在模块内设置工厂,并请求在其上注入以填充颜色集

模块:

ColorFactory colorFactory = new ColorFactory();

requestInjection(colorFactory);

bind(Color.class).annotatedWith(Names.named("light")).toInstance(colorFactory.buildColor("white"));
bind(Color.class).annotatedWith(Names.named("dark")).toInstance(colorFactory.buildColor("black"));
颜色工厂:

public class ColorFactory {

    private ColorSet colorSet;

    public Color buildColor(String color){
        return new Color(colorSet, color);
    }

    @Inject
    public void setColorSet(ColorSet colorSet) {
        this.colorSet = colorSet;
    }
}

做到这一点的最好方法不是与工厂合作,而是与企业合作。我的公司非常广泛地使用Guice,
requestInjection
总是被认为是一个坏主意,因为它可以很容易地建立一个非常脆弱的隐式依赖关系图

下面是它的外观:

public class FooModule extends AbstractModule {
  protected void configure() {
    // do configuration
  }

  @Provides
  @Named("white")
  Color provideWhiteColor(ColorSet colorSet) {
    return colorSet.white(); // or whatever
  }

  @Provides
  @Named("black")
  Color provideBlackColor(ColorSet colorSet) {
    return colorSet.black(); // or whatever
  }

  // etc
}

在我见过的代码库中,很少有直接使用注入器来获取特定对象的代码

injector.getInstance(Color.class);
在这种情况下,您可以使用以下选项:

injector.getInstance(Key.get(Color.class, Names.named("light")));

哦,我读到了,因为你不想要每种颜色的子类(即:白色)。你想参考其他颜色吗?你能澄清一下你对颜色集的使用吗?这只是真实情况的一个简单例子。没有一个颜色集,有一个由guice创建和连接的对象图。您的颜色被认为是不可变的吗?没有,但是如果我使它们不可变会有帮助吗?这是个好主意,也许我还可以将它与Modules.override()混合使用()这很有帮助——你知道如何使用Guice注入器来获得这两个实例吗?正在寻找类似于
Guice.createInjector(foodmodule).getInstance(Color.class)
的东西,但其规范为“白色”或“黑色”。我不确定如何使用@Named,但无论如何都应该使用绑定注释()。然后您可以说injector.getInstance(Key.get(Color.class,Black.class))(尽管我可能在某些地方缺少通用类型规范)。getInstance(…)被重载为也接受一个键(),而不仅仅是一个类。