Как внедрить эту карту в качестве компонента с помощью guice?

#java #guice

#java #guice

Вопрос:

Я пытаюсь внедрить карту, которая инициализируется с использованием определенных статических констант в моем классе.

Однако я не могу продолжить, поскольку я новичок в Guice, и я не совсем уверен, как я могу использовать эту карту? Карта, которую я хочу внедрить, это:

Карта> myMap в MyClass.

Я написал класс для MyInjectedMap, содержащий myMap, где он также будет создан. Я написал модуль и привязал к нему этот класс. Но это не работает.

 public class MyInjectedMap {

    private Map<String, List<String>> MyMap = new HashMap<>();

    private List<String> data = Arrays.asList("abc");

}
  

Я хочу заполнить myMap списком массива данных, который я создал.
Я хочу спросить, какой метод должен быть написан в этом классе, чтобы он предоставлял мне myMap для внедрения?

Комментарии:

1. Если вы используете Guice только для достижения внедрения, найдите java.lang.reflect , он предоставляет #set для всех полей

Ответ №1:

Вы захотите преобразовать MyInjectedMap в provider, а затем соответствующим образом привязать его к вашему модулю. Предполагая, что вам не нужна эта карта для ВСЕХ карт, вы собираетесь либо создать пользовательскую аннотацию, либо использовать @Named, предоставленный guice:

 public class MyMapProvider implements Provider<Map<String,List<String>> {
    private Map<String,List<String>> myMap = new HashMap<>();

    public Map<String,List<String>> get() {
        return myMap;
    }
}
  

И настройте инжектор:

 bind(new TypeLiteral<Map<String,List<String>>>(){}).annotatedWith(Names.named("MyMap")).toProvider(MyMapProvider.class);
  

А затем внедрить ее:

 @Inject @Named("MyMap") Map<String,List<String>> myMap;
  

https://github.com/google/guice/wiki/ProviderBindings