我正在使用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作为提供方法的参数,但这似乎很浪费,因为无论使用哪种方法都会创建它们。
答案 0 :(得分:2)
For any type T
, you can inject Provider<T>
即使您从未明确绑定该类型的提供商。 Guice将注入一个通用的Provider实例,该实例在被调用时将使用请求的密钥从Injector请求实例。这将避免创建实例,除非在正确的Provider上调用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();
}
}