Spring Boot @Bean Map<String, ChargingGateway> и автоматическая инъекция Map<String, ChargingGateway> ведут себя по-разнJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Boot @Bean Map<String, ChargingGateway> и автоматическая инъекция Map<String, ChargingGateway> ведут себя по-разн

Сообщение Anonymous »

Вопрос:
Я наблюдаю разное поведение в двух приложениях Spring Boot в отношении внедрения Map.
У меня такая конфигурация:

Код: Выделить всё

@Bean
public Map handlerMap() {
return new HashMap();
}
А эта точка инъекции:

Код: Выделить всё

public DocumentController(Map handlerMap) {
this.handlerMap = handlerMap;
}
Существует несколько реализаций ChargingGateway:

Код: Выделить всё

@Component("ab")
class AbGateway implements ChargingGateway {}

@Component("cd")
class CdGateway implements ChargingGateway {}
Ожидаемое поведение:
Если bean handlerMap существует и возвращает пустой HashMap, я ожидаю, что эта пустая карта будет внедрена.
Если я удалю @Bean, Spring должен внедрить карту, содержащую все bean-компоненты ChargingGateway (автоматическое внедрение коллекции).
Что на самом деле происходит:
В приложении A:
  • Если bean handlerMap присутствует → внедренная карта пуста.
  • Если я ее удалю → внедренная карта содержит все bean-компоненты ChargingGateway.
    (Это соответствует ожиданиям.)`
Весенняя версия 3.4.4
В приложении B:
  • С обработчиком bean-компонентаMap → заполняется внедренная карта.
  • Без него → внедряемая карта также заполняется.
    (Нет заметной разницы.)`
Весна версии 3.2.2
В обоих приложениях:
  • Используется внедрение конструктора
  • имя метода и имя параметра конструктора — это handlerMap
  • Нет @Qualifier или @Primary
  • Код: Выделить всё

    ChargingGateway
    реализации являются обычными @Component
Карта фактически является точкой входа. Если бы оно было пустым, приложение потерпело бы неудачу во время выполнения. Однако в производстве он работает нормально в обоих случаях.
Вопрос:
При каких условиях Spring выберет автоматически созданный Map (содержащий все T-компоненты) вместо явно определенного @Bean Map?
Может ли на это повлиять:
  • Метаданные имени параметра конструктора (-параметры)
  • Различные настройки компиляции между двумя приложениями
  • правила приоритета разрешения
Я пытаюсь понять точный механизм разрешения зависимостей, который объясняет различное поведение между двумя приложениями.`
Примечание: я почти уверен, что в приложении B карта ничем не загружается.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... -chargingg
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»