Подтвердить что ты не робот

Может создавать HashMap с помощью Spring, но не может создать карту

Я могу сделать это в своем приложенииContext с Spring (3.0.5):

<bean id="map" class="java.util.HashMap" scope="prototype" >
    <constructor-arg>
        <map key-type="java.lang.String" value-type="java.lang.String">
            <entry key="Key 1" value="1" />
            <entry key="Key 2" value="2" />
        </map>
    </constructor-arg>
</bean>

И в моем контроллере я могу автоопределить мою карту следующим образом:

@Autowired
@Qualifier("map")
private HashMap<String, String> map;

Он отлично работает, но если я это сделаю:

@Autowired
@Qualifier("map")
private Map<String, String> map;

Получаю:

Вызвано: org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет соответствие bean типа [java.lang.String] найдено для зависимости [map со значением типа java.lang.String]: ожидается как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости. зависимость аннотации: {@Org.springframework.beans.factory.annotation.Autowired(обязательно = истина), @Org.springframework.beans.factory.annotation.Qualifier(value = карта)}

Мой вопрос: почему я не могу авторизовать мою карту с интерфейсом, когда могу, с реализацией?

Спасибо.

4b9b3361

Ответ 1

Объявляя bean коллекции типов, его нельзя вводить с помощью @Autowired. См. Ниже документацию из Spring:

4.11.3 Точная настройка автозапуска на основе аннотаций с квалификаторами

Как конкретное следствие этой семантической разницы, beans, которые сами определяемые как тип коллекции или карты, не могут быть введены через @Autowired, поскольку соответствие типов не подходит для них. использование @Resource для такого beans, ссылаясь на конкретный сбор/карту bean по уникальному имени.

Таким образом, вместо @Autowired используйте @Resource:

@Resource
@Qualifier("map")
private Map<String, String> map;