2016-12-28 6 views
2

У меня есть карта в моем файле как:Bind различных карт с помощью Guice

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

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

Я хочу, чтобы внедрить эту карту в конструкторе класса, используя Guice. Я делаю что-то вроде:

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

Может кто-нибудь подскажет, как я впрыснуть одну из двух карт (workflowProperties1 или workflowProperties2) в MyClass выше на основе статического значения параметра?

+0

В чем файл, содержащий определения карты? – tariksbl

ответ

3

Решение может заключаться в использовании Guice Multibindings. Обратите внимание, что мультииндикаторы не включены в основной набор Guice, поэтому вам потребуется дополнительная зависимость от com.google.inject.extensions:guice-multibindings.

Тогда вы можете определить свой связывающий модуль, что-то вроде этого (на самом деле вы будете извлекать ключ/значение, 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"); 
} 

Затем вы можете легко придать правильную карту «на основе значение статического параметра ", как вы задали, например:

private static final String STATIC_PARAMETER_VALUE = "workflowProperties1"; 

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

Вы можете создать конкретный класс

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 конфигурации или любого другого связывание.