我有一个接口(interface)有 20 个左右带注释的实现。如果我在编译时知道我需要哪个,我可以注入(inject)正确的,但我现在需要根据运行时参数动态注入(inject)一个。
据我了解文档,我将不得不使用 20 左右 Provider<T>
注入(inject)然后使用我需要的那个,这对我来说似乎太过分了。有没有办法得到类似 inst(Provider<T>).get(MyAnnotation.class)
的东西?绑定(bind)特定的实现,然后只有那个 Provider
注入(inject)我的类(class)?
最佳答案
注入(inject)MapBinder .
在您的模块中,将绑定(bind)加载到 MapBinder
中,然后使您的运行时参数也可注入(inject)。此示例基于文档中的示例:
public class SnacksModule extends AbstractModule {
protected void configure() {
MapBinder<String, Snack> mapbinder
= MapBinder.newMapBinder(binder(), String.class, Snack.class);
mapbinder.addBinding("twix").to(Twix.class);
mapbinder.addBinding("snickers").to(Snickers.class);
mapbinder.addBinding("skittles").to(Skittles.class);
}
}
然后,在您的对象中,注入(inject) Map
和参数。对于这个例子,我假设你已经绑定(bind)了一个 java.util.Properties
对于您的运行时参数:
@Inject
public MyObject(Map<String, Provider<Snack>> snackProviderMap, Properties properties) {
String snackType = (String) properties.get("snackType");
Provider<Snack> = snackProviderMap.get(property);
// etc.
}
注意,与MapBinder
相同你可以注入(inject)一个简单的 Map<String, Snack>
或 Map<String, Provider<Snack>>
; Guice 将两者结合起来。
关于java - Guice:一个 "Provider<T>"用于多个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30133305/