Свойство Бина не устанавливается из util:list object

Я объявил следующий список, используя пространство имен spring util в моем файле конфигурации spring:

<util:list id="childList">
        <ref bean="child1"/>
        <ref bean="child2"/>
        <ref bean="child3"/>
</util:list>

где все ссылочные компоненты помечены аннотацией @Componant, и их соответствующие компоненты создаются. Но всякий раз, когда я пытаюсь Autowired любое свойство бобов, как:

@Component
public class ListTest{

@Autowired
@Qualifier("childList")
private List<IParent> list;

public List<IParent> getList() {
    return list;
}

}

Выдает исключение как: org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем "listTest": сбой внедрения зависимостей с автопроводкой; вложенным исключением является org.springframework.beans.factory.BeanCreationException: не удалось автоматически связать поле: private java.util.List com.spring3.componentScanFilterTest.ListTest.list; вложенным исключением является org.springframework.beans.factory.NoSuchBeanDefinitionException: не найден соответствующий компонент типа [com.spring3.componentScanFilterTest.IParent] для зависимости [коллекция com.spring3.componentScanFilterTest.IParent]: ожидается, что по крайней мере 1 компонент, который соответствует autowire кандидат на эту зависимость. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(обязательно =true), @org.springframework.beans.factory.annotation.Qualifier(value=childList)}

Но вместо @Autowired и @Qualifier, если я использую как: @Resource(name="childList")

Оно работает. Зачем? Насколько я понимаю, @Autowired используется для автоматической передачи соответствия свойств по типу, а @Qualifier используется для выбора любого одного компонента из нескольких неоднозначных компонентов.

Пожалуйста, объясни.

2 ответа

Весной документы говорит.

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

Надеюсь, это очистит ваши сомнения.

Соответствие типов не применимо к бинам, которые определены как коллекции.

Если вы намерены выражать внедрение, основанное на аннотациях, по имени, не используйте в первую очередь @Autowired - даже если он технически способен ссылаться на имя компонента с помощью значений @Qualifier. Вместо этого предпочтение отдается аннотации JSR-250 @Resource, которая семантически определена, чтобы идентифицировать конкретный целевой компонент по его уникальному имени, причем объявленный тип не имеет значения для процесса сопоставления.

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

Здесь: http://docs.spring.io/spring/docs/2.5.x/reference/beans.html

Вы пытаетесь получить список всех bean-компонентов типа Parent, имеющих квалификатор childList.

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