У меня следующий класс:
@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()...
...
}
}
Есть ли способ автоматически подключить только карту и, следовательно, напрямую использовать значения внутри карты?
@AndrewS Спасибо, я сделал это, и я последовал приведенному ниже ответу, но тогда мне следует автоматически подключать метод, а не саму карту?
Это зависит от вас, но посмотрите этот другое обсуждение, который рекомендует использовать внедрение конструктора.




Вы можете создать метод с аннотацией @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?
Неа. Имя переменной не обязательно должно совпадать с именем метода. Контейнер Spring внедрит bean-компонент типа Map <ObjectType, List <Action>>.
Добавьте @Bean к методу
getMap()(попробуйте придумать имя получше) и @Autowire карту, где это необходимо. ОднакоfillMap()может быть вызван после того, как немного проводки уже завершено, что может быть проблемой в зависимости от того, как используется карта - просто убедитесь, что она заполнена перед ее использованием. Также будьте осторожны с параллелизмом - при необходимости сделайте карту ConcurrentHashMap.