吉斯multibinder与供应商
我想能够有这个在我的代码吉斯multibinder与供应商
@Inject
private Map<String, Provider<Processor>> providers;
我是想,但是这个代码不编译
MapBinder<String, Provider<Processor>> mapbinder = MapBinder.newMapBinder(binder, String.class, Provider<Processor>.class);
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class);
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);
此代码启动失败,因为它无法绑定我的地图
MapBinder<String,Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class);
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class);
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);
如何在此处正确设置绑定?
注意:我也在寻找一些简单的东西,所以开发人员只需在每次有新处理器时添加一行(我希望我不必添加一行+一些工厂接口...应该是方式,但除了上面的TypeLiteral和toProvider()方法外,我还尝试了其他方法)。我发现如果我有下面的行(但不要调用addBinding)Guice实际上会启动这是好的,但所有addBinding()。方法签名现在都是错误的,因为它们是错误的想
Provider<? extends Provider<Processor>>
//This below line ends up with mabbinder2.addBinder().to() wanting the above param type?
MapBinder<String, Provider<Processor>> mapbinder2 = MapBinder.newMapBinder(binder, stringLit, list);
从根本上改变了我的思想,我尝试注入这样的事情(希望map.get(“XXX”)创建新实例每次...
@Inject
private Map<String, Processor> providers;
我束缚像这样,但不幸的是,地图总是返回相同的实例:(...
MapBinder<String, Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class);
mapbinder.addBinding("splineV1Beta").toProvider(new TypeLiteral<Provider<SplineProcessor>>() {;});
mapbinder.addBinding("invertV1Beta").toProvider(new TypeLiteral<Provider<InvertProcessor>>() {;});
编辑:根据本文档http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/MapBinder.html你可以有一个
MapBinder<String, Snack> and inject a Map<String, Provider<Snack>>
,但是当我这样做(带私人领域),我得到以下......(而当我改变我的其他解决方案,但不叫mapbinder.addBinding,它结合并工作得很好)......
1) No implementation for java.util.Map<java.lang.String,
javax.inject.Provider<controllers.modules2.framework.Processor>> was bound.
我一定要使用构造器注入该像他们为榜样的工作?我是一个抽象类,所以这将是非常不方便,更改10类:(。
感谢, 院长
虽然吉斯似乎是有关使用JSR-330注解互换非常好,似乎Multibindings隐藏内Map
,因此Provider
类型可以期待注入java.util.Map<java.lang.String, com.google.inject.Provider<...>>
,而不是我一直无法重现你的问题,但尝试,看看它是否有助于
边注:如果你想避免改变它的代码无处不在,你可以hackishly绑定Map<String, javax.inject.Provider<Foo>>
提供者的东西akes在multibinder创建Map<String, com.google.inject.Provider<Foo>>
。如果我是对的,这就是问题所在,你可以将它解决一个地方,而不是在各个地方跳到javax.inject
和com.google.inject
之间。
如果你想Map<String, Provider<Processor>>
注入点,绑定的方式是:
MapBinder<String, Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class); mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class); mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);
你会使用toProvider()
如果提供自定义的供应商,你都没有,也就是说你仅仅是试图使用隐含的底层提供者。
您也可以升级到Guice 4以获得修复。 – 2015-08-29 19:49:15