Как мне ввести только Map <Object, List <Object>> с помощью spring -boot?

У меня следующий класс:

@Configuration
public class ActionsConfig {

  private Map<ObjectType, List<Action>> map = new HashMap<>();

  @Bean
  public Action1 action1() {

    return new Action1();
  }


  @Bean
  public Action2 action2(){

    return new Action2();
  }

  @Bean
  public Action3 action3(){

    return new Action3();
  }

  private void fillMap(){
     //here I am filling my map
  }

  public Map<ObjectType, List<Action>> getMap(){
    return this.map;
  }
}

Классы Action1, Action2 и Action3 реализуют общий интерфейс Action. Затем в моем сервисе я автоматически подключаю класс ActionsConfig и получаю карту.

@Service
public class BasketService {
     @Autowired
     private ActionsConfig actionsConfig;
     ...
     public void doSomething(){
        ...
        actionsConfig.getMap()...
        ...
     }
}

Есть ли способ автоматически подключить только карту и, следовательно, напрямую использовать значения внутри карты?

Добавьте @Bean к методу getMap() (попробуйте придумать имя получше) и @Autowire карту, где это необходимо. Однако fillMap() может быть вызван после того, как немного проводки уже завершено, что может быть проблемой в зависимости от того, как используется карта - просто убедитесь, что она заполнена перед ее использованием. Также будьте осторожны с параллелизмом - при необходимости сделайте карту ConcurrentHashMap.

Andrew S 29.11.2018 15:36

@AndrewS Спасибо, я сделал это, и я последовал приведенному ниже ответу, но тогда мне следует автоматически подключать метод, а не саму карту?

sammy333 30.11.2018 10:34

Это зависит от вас, но посмотрите этот другое обсуждение, который рекомендует использовать внедрение конструктора.

Andrew S 30.11.2018 15:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать метод с аннотацией @Bean.

  @Bean
  public Map<ObjectType, List<Action>> getMap() {

    Map<ObjectType, List<Action>> map = new HashMap<>();
    fillMap()

    return map;
  }

Затем вы можете использовать @Autowired для автоматического подключения карты.

@Autowired
private Map<ObjectType, List<Action>> myMap;

Спасибо за ваш ответ. Просто вопрос - я думаю, я должен Autowire имя метода правильно? (т.е. @Autowired private Map<ObjectType, List<Action>> getMap;). не myMap?

sammy333 30.11.2018 10:31

Неа. Имя переменной не обязательно должно совпадать с именем метода. Контейнер Spring внедрит bean-компонент типа Map <ObjectType, List <Action>>.

Jerome 30.11.2018 12:09

Другие вопросы по теме