如何根据@Named参数配置Guice模块中绑定的具体类?

时间:2015-10-06 15:58:58

标签: java dependency-injection guice

我正在使用Names.bindProperties()从属性文件中读取配置值。

我有一个接口,我们称之为Fruit,我想将它绑定到Apple或Orange具体类,具体取决于属性文件中其中一个参数的值。

我在想这样的事情:

@Provides Fruit provideFruit(@Named("fruit-type") String fruitType) {
    switch (fruitType) {
       case "apple":
           return ???;
       case "orange":
           return ???;
    }
}

问题是如何从提供方法中获取Apple或Orange的实例,以便它将由Guice创建?

我想我可以将Apple和Orange作为提供方法的参数,但这似乎很浪费,因为无论使用哪种方法都会创建它们。

1 个答案:

答案 0 :(得分:2)

For any type T, you can inject Provider<T>即使您从未明确绑定该类型的提供商。 Guice将注入一个通用的Provider实例,该实例在被调用时将使用请求的密钥从Injector请求实例。这将避免创建实例,除非在正确的Provider上调用get

这不是@Provides方法独有的;你可以在任何地方注入TProvider<T>,Guice会创建一个Provider或者在必要时隐式调用Provider.get,包括@Inject字段,方法或构造函数。

@Provides Fruit provideFruit(
        @Named("fruit-type") String fruitType,
        Provider<Apple> appleProvider,
        Provider<Orange> orangeProvider) {
    switch (fruitType) {
       case "apple":
           return appleProvider.get();
       case "orange":
           return orangeProvider.get();
    }
}