Свойство Бина не устанавливается из 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.