我有一个包含 20 个左右带注释的实现的接口。如果我在编译时知道需要哪个,我可以注入正确的,但现在我需要根据运行时参数动态注入一个。
据我了解文档,我将不得不使用 20 左右Provider<T>
注射然后使用我需要的药物,这对我来说似乎有点过分了。有没有办法拥有类似的东西inst(Provider<T>).get(MyAnnotation.class)
绑定一个特定的实现,然后只有那个Provider
注入我的班级?
注入一个地图绑定器.
在您的模块中,将绑定加载到MapBinder
,然后使您的运行时参数也可注入。此示例基于文档中的示例:
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);
}
}
然后,在您的对象中注入Map
和参数。对于这个例子,我假设你已经绑定了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
你可以注入一个简单的Map<String, Snack>
or a Map<String, Provider<Snack>>
;吉斯将两者结合在一起。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)