用Guice注入Map的值

Jac*_*ack 3 java dependency-injection guice

我有一个Guice托管服务,注入了一些其他服务.根据传递给我的服务方法的键值使用其他服务.所以我想制作一个Map将要使用的服务映射到相应的密钥:

@Inject
private IServiceA serviceA;

@Inject
private IServiceB serviceB;

private Map<String, IService> mapping;

private Map<String, IService> getMapping() {
    if (mapping == null) {
        mapping = new HashMap<String, IService>();
        mapping.put("keyA", serviceA);
        mapping.put("keyB", serviceB);
    }
}

@Override
public void myServiceMethod(String key) {
    IService serviceToUse = getMapping().get(key);
    // ... use some methods of the identified service
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案有效,但看起来很尴尬,因为我必须对映射进行这种懒惰的初始化.我试图使用一个static块,但此时Guice尚未初始化实例成员.

我更愿意直接用Guice注入映射值,但我不知道如何实现这一点.

dur*_*597 8

只需使用MapBinder,例如

protected void configure() {
    MapBinder<String, IService> mapBinder = MapBinder.newMapBinder(binder(), String.class, IService.class);
    mapBinder.addBinding("keyA").to(IServiceA.class);
    mapBinder.addBinding("keyB").to(IserviceB.class);
}
Run Code Online (Sandbox Code Playgroud)

然后你注入整个地图,例如

public class IServiceController {
   @Inject
   private Map<String, IService> mapping;
}
Run Code Online (Sandbox Code Playgroud)