【问题标题】:Bind different maps using guice使用guice绑定不同的地图
【发布时间】:2016-12-28 18:06:43
【问题描述】:

我的文件中有一张地图,例如:

workflowProperties1 = { "key1" : "value1"; "key2": "value2"; };

workflowProperties2 = { "key1" : "value1"; "key2": "value2"; };

我想使用 guice 将此映射注入到类的构造函数中。我正在做类似的事情:

@Inject public myClass(@Named("workflowProperties1") Map<String,String> someMap) { }

有人可以建议我如何根据静态参数值在上面的 myClass 中注入两个映射(workflowProperties1 或 workflowProperties2)之一吗?

【问题讨论】:

  • 包含地图定义的文件是什么?

标签: binding guice


【解决方案1】:

解决方案可能是使用Guice Multibindings。请注意,核心 Guice 中不包含多绑定器,因此您需要对 com.google.inject.extensions:guice-multibindings 的额外依赖。

然后你可以定义你的绑定模块,像这样(实际上你会从你的文件中提取键/值):

@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");
}

然后您可以按照您的要求轻松地“基于静态参数值”注入正确的地图,例如:

private static final String STATIC_PARAMETER_VALUE = "workflowProperties1";

@Inject
@Named(STATIC_PARAMETER_VALUE) 
Map<String,String> someMap;

【讨论】:

    【解决方案2】:

    你可以创建一个具体的类

    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 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());
      }
    }
    

    其中workFlowProperties2workFlowProperties2WorkFlowProperties 的实例,可以使用.yml 配置或任何其他绑定进行配置。

    【讨论】:

    • 是否应该使用方法“toInstance()”而不是“to()”? “to()”函数需要一个类类型
    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多