使用guice绑定不同的地图
Bind different maps using guice
我的文件中有一张地图,例如:
workflowProperties1 = { "key1" : "value1"; "key2": "value2"; };
workflowProperties2 = { "key1" : "value1"; "key2": "value2"; };
我想使用 guice 将此映射注入 class 的构造函数中。我正在做类似的事情:
@Inject public myClass(@Named("workflowProperties1") Map<String,String> someMap) { }
有人可以建议我如何根据静态参数值在上面的 myClass 中注入两个映射之一(workflowProperties1 或 workflowProperties2)吗?
你可以创建一个具体的 class
public class WorkFlowProperties {
Map<String, String> someMap;
public Map<String, String> getSomeMap() {
return someMap;
}
public void setSomeMap(Map<String, String> someMap) {
this.someMap = someMap;
}
}
在您的 ApplicationModule 中
ApplicationModule extends AbstractModule {
...
@Override
protected void configure() {
bind(Map.class).annotatedWith(Names.named("workflowProperties1")).to(workFlowProperties1.getSomeMap());
bind(Map.class).annotatedWith(Names.named("workflowProperties2")).to(workFlowProperties2.getSomeMap());
}
}
其中 workFlowProperties2
和 workFlowProperties2
是 WorkFlowProperties
的实例,可以使用 .yml
配置或任何其他绑定进行配置。
一个解决方案可能是使用 Guice Multibindings。请注意,核心 Guice 中不包含多重绑定器,因此您需要额外依赖 com.google.inject.extensions:guice-multibindings
.
然后你可以定义你的绑定模块,像这样(实际上你将从你的文件中提取 key/value-s):
@Override
protected void configure()
{
MapBinder<String, String> wf1Binder = MapBinder.newMapBinder(
binder(),
String.class,
String.class, Names.named("workflowProperties1"));
wf1Binder.addBinding("WF1Key").toInstance("WF1Value");
MapBinder<String, String> wf2Binder = MapBinder.newMapBinder(
binder(),
String.class,
String.class, Names.named("workflowProperties2"));
wf2Binder.addBinding("WF2Key").toInstance("WF2Value");
}
然后您可以轻松地按照您的要求注入正确的映射 "based on a static parameter value" 例如:
private static final String STATIC_PARAMETER_VALUE = "workflowProperties1";
@Inject
@Named(STATIC_PARAMETER_VALUE)
Map<String,String> someMap;
我的文件中有一张地图,例如:
workflowProperties1 = { "key1" : "value1"; "key2": "value2"; };
workflowProperties2 = { "key1" : "value1"; "key2": "value2"; };
我想使用 guice 将此映射注入 class 的构造函数中。我正在做类似的事情:
@Inject public myClass(@Named("workflowProperties1") Map<String,String> someMap) { }
有人可以建议我如何根据静态参数值在上面的 myClass 中注入两个映射之一(workflowProperties1 或 workflowProperties2)吗?
你可以创建一个具体的 class
public class WorkFlowProperties {
Map<String, String> someMap;
public Map<String, String> getSomeMap() {
return someMap;
}
public void setSomeMap(Map<String, String> someMap) {
this.someMap = someMap;
}
}
在您的 ApplicationModule 中
ApplicationModule extends AbstractModule {
...
@Override
protected void configure() {
bind(Map.class).annotatedWith(Names.named("workflowProperties1")).to(workFlowProperties1.getSomeMap());
bind(Map.class).annotatedWith(Names.named("workflowProperties2")).to(workFlowProperties2.getSomeMap());
}
}
其中 workFlowProperties2
和 workFlowProperties2
是 WorkFlowProperties
的实例,可以使用 .yml
配置或任何其他绑定进行配置。
一个解决方案可能是使用 Guice Multibindings。请注意,核心 Guice 中不包含多重绑定器,因此您需要额外依赖 com.google.inject.extensions:guice-multibindings
.
然后你可以定义你的绑定模块,像这样(实际上你将从你的文件中提取 key/value-s):
@Override
protected void configure()
{
MapBinder<String, String> wf1Binder = MapBinder.newMapBinder(
binder(),
String.class,
String.class, Names.named("workflowProperties1"));
wf1Binder.addBinding("WF1Key").toInstance("WF1Value");
MapBinder<String, String> wf2Binder = MapBinder.newMapBinder(
binder(),
String.class,
String.class, Names.named("workflowProperties2"));
wf2Binder.addBinding("WF2Key").toInstance("WF2Value");
}
然后您可以轻松地按照您的要求注入正确的映射 "based on a static parameter value" 例如:
private static final String STATIC_PARAMETER_VALUE = "workflowProperties1";
@Inject
@Named(STATIC_PARAMETER_VALUE)
Map<String,String> someMap;