gpt4 book ai didi

java - Guice:使用@Named 创建对象

转载 作者:行者123 更新时间:2023-12-03 23:14:35 29 4
gpt4 key购买 nike

使用 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(){...} 中不可用。

我想这样做没有:
  • 为我需要注入(inject)的每种颜色创建一个类/子类(如 WhiteColor)
  • 在我的代码中直接使用反射
  • 更改我的类(class)以使用 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/

    29 4 0