Я наблюдаю разное поведение в двух приложениях Spring Boot в отношении внедрения Map.
У меня такая конфигурация:
Код: Выделить всё
@Bean
public Map handlerMap() {
return new HashMap();
}
Код: Выделить всё
public DocumentController(Map handlerMap) {
this.handlerMap = handlerMap;
}
Код: Выделить всё
@Component("ab")
class AbGateway implements ChargingGateway {}
@Component("cd")
class CdGateway implements ChargingGateway {}
Если bean handlerMap существует и возвращает пустой HashMap, я ожидаю, что эта пустая карта будет внедрена.
Если я удалю @Bean, Spring должен внедрить карту, содержащую все bean-компоненты ChargingGateway (автоматическое внедрение коллекции).
Что на самом деле происходит:
В приложении A:
- Если bean handlerMap присутствует → внедренная карта пуста.
- Если я ее удалю → внедренная карта содержит все bean-компоненты ChargingGateway.
(Это соответствует ожиданиям.)`
В приложении B:
- С обработчиком bean-компонентаMap → заполняется внедренная карта.
- Без него → внедряемая карта также заполняется.
(Нет заметной разницы.)`
В обоих приложениях:
- Используется внедрение конструктора
- имя метода и имя параметра конструктора — это handlerMap
Код: Выделить всё
@Bean - Нет @Qualifier или @Primary
- реализации являются обычными @Component
Код: Выделить всё
ChargingGateway
Вопрос:
При каких условиях Spring выберет автоматически созданный Map (содержащий все T-компоненты) вместо явно определенного @Bean Map?
Может ли на это повлиять:
- Метаданные имени параметра конструктора (-параметры)
- Различные настройки компиляции между двумя приложениями
- правила приоритета разрешения
Код: Выделить всё
@Bean
Примечание: я почти уверен, что в приложении B карта ничем не загружается.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... -chargingg
Мобильная версия