如何根据 @Named 参数配置哪个具体 class 绑定在 Guice 模块中?
How do I configure which concrete class is bound in a Guice module depending on a @Named parameter?
我正在使用 Names.bindProperties() 从属性文件中读取配置值。
我有一个接口,我们称它为 Fruit,我想根据属性文件中这些参数之一的值将它绑定到 Apple 或 Orange 混凝土 类。
我在想这样的事情:
@Provides Fruit provideFruit(@Named("fruit-type") String fruitType) {
switch (fruitType) {
case "apple":
return ???;
case "orange":
return ???;
}
}
问题是如何从 provides 方法中获取 Apple 或 Orange 的实例,以便由 Guice 创建?
我想我可以将 Apple 和 Orange 作为 provides 方法的参数,但这似乎很浪费,因为无论使用哪个,都会创建它们。
For any type T
, you can inject Provider<T>
即使您从未明确为该类型绑定 Provider。 Guice 将注入一个通用的 Provider 实例,当调用该实例时,它将使用请求的密钥从 Injector 请求一个实例。这将避免创建实例,除非在正确的提供者上调用 get
。
这不是@Provides 方法独有的;您可以在任何地方注入 T
或 Provider<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();
}
}
我正在使用 Names.bindProperties() 从属性文件中读取配置值。
我有一个接口,我们称它为 Fruit,我想根据属性文件中这些参数之一的值将它绑定到 Apple 或 Orange 混凝土 类。
我在想这样的事情:
@Provides Fruit provideFruit(@Named("fruit-type") String fruitType) {
switch (fruitType) {
case "apple":
return ???;
case "orange":
return ???;
}
}
问题是如何从 provides 方法中获取 Apple 或 Orange 的实例,以便由 Guice 创建?
我想我可以将 Apple 和 Orange 作为 provides 方法的参数,但这似乎很浪费,因为无论使用哪个,都会创建它们。
For any type T
, you can inject Provider<T>
即使您从未明确为该类型绑定 Provider。 Guice 将注入一个通用的 Provider 实例,当调用该实例时,它将使用请求的密钥从 Injector 请求一个实例。这将避免创建实例,除非在正确的提供者上调用 get
。
这不是@Provides 方法独有的;您可以在任何地方注入 T
或 Provider<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();
}
}