Guice внедрить объект в конструктор класса - PullRequest
0 голосов
/ 27 января 2019

Я только начал смотреть на Guice для нового проекта.У меня есть что-то вроде

класса ConfigImpl и интерфейса Config

 interface Config{...}

 class ConfigImpl implements Config {
   private static final Map<> propMap;
   public ConfigImpl(Map<> propMap) {
     this.propMap = someProps;
   }
 }

Инъекция Guice Я придумал

public class MyInjector extends AbstractModule {
  protected void configure() {
    bind(Config.class).to(ConfigImpl.class)
  }
}

и наконец

public SomeClass {
  Config someConfig;
  Injector injector = Guice.createInjector(new MyInjector());
  someConfig = injector.getInstance(Config.class);          
}

Теперь я очень растерялся, так как не могу найти способ передать propMap в класс ConfigImpl.Я хотел бы знать правильный способ сделать это в Guice.Спасибо!

1 Ответ

0 голосов
/ 28 января 2019

Вы должны ввести propMaps из вашего модуля:

public class MyInjector extends AbstractModule {
  private final Map<String,String> mapProps;
  public MyInjector(Map<String,String> mapProps) {
    this.mapProps = mapProps;
  }
  protected void configure() {
    bind(Config.class).to(ConfigImpl.class).in(Scope.SINGLETON);         // You most than likely want this
    bind(new TypeLiteral<Map<String,String>>() {}).toInstance(mapProps); // binding for the map.
  }
}

И используйте это так:

public class SomeClass {
  void doSomething() {
    Map<String,String> mapProps = ... ;
    Injector injector = Guice.createInjector(new MyInjector(mapProps));
    Config someConfig = injector.getInstance(Config.class);          
  }
}

Кроме того, вы должны исправить свой ConfigImpl класс:

class ConfigImpl implements Config {
  private final Map<String,String> propMap;
  @Inject                                         // mandatory since you use a non-default constructor
  public ConfigImpl(Map<String,String> propMap) { // add the generic type of the map
    this.propMap = propMap;
  }
}
...