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

Java 如何根据@Named参数配置Guice模块中绑定的具体类?,java,dependency-injection,guice,Java,Dependency Injection,Guice,我正在使用Names.bindProperties()从属性文件读取配置值 我有一个接口,我们称之为Fruit,我想根据属性文件中这些参数之一的值将它绑定到Apple或Orange具体类 我是这样想的: @Provides Fruit provideFruit(@Named("fruit-type") String fruitType) { switch (fruitType) { case "apple": return ???; ca

我正在使用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作为provides方法的参数,但这似乎是浪费,因为无论使用哪种方法,都会创建它们。

即使您从未为该类型显式绑定提供程序。Guice将注入一个通用提供程序实例,该实例在被调用时将使用请求的密钥从注入器请求一个实例。这将避免创建实例,除非对正确的提供程序调用了
get

这不是@Provides方法所独有的;您可以在任何位置插入
T
提供程序,Guice将创建提供程序或调用提供程序。必要时隐式获取,包括使用
@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();
    }
}
@提供水果提供水果(
@命名(“水果类型”)字符串水果类型,
提供程序appleProvider,
提供商(orangeProvider){
开关(水果型){
案例“苹果”:
返回appleProvider.get();
案例“橙色”:
返回orangeProvider.get();
}
}