使用 Guice,如果我有
@Inject @Named("light")
Color light;
我可以用
bind(Color.class).annotatedWith(Names.named("light"))
.toInstance(new Color("white"));
如果 Color 构造函数只需要颜色名称,则将其绑定(bind)到白色。
但是,如果 Color 构造函数还需要由 Guice 创建的对象,我该怎么做呢?例如:
@Inject
public Color(ColorSet colorset, String colorName) {...}
其中颜色集由 Guice 在运行时创建,在 configure(){...} 中不可用。
我想这样做没有:
ColorFactoy factory; factory.get("light");
而不是 @Named("light") Color light;
最佳答案
最好的方法不是使用工厂,而是使用 @Provides
methods .我的公司非常非常广泛地使用 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
}
关于java - Guice:使用@Named 创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290164/