Java Guice:使用@Named创建对象
使用Guice,如果我有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
@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(…)被重载为也接受一个键(),而不仅仅是一个类。