Bean的属性不是从util:list对象

时间:2015-10-16 10:06:21

标签: spring spring-3 spring-annotations

我在spring配置文件中使用spring util命名空间声明了以下列表:

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

其中所有引用bean都标有@Componant注释,并且它们各自的bean正在创建。但每当我尝试Autowired任何bean属性,如:

@Component
public class ListTest{

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

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

}

将异常提供为:org.springframework.beans.factory.BeanCreationException:创建名为“listTest”的bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private java.util.List com.spring3.componentScanFilterTest.ListTest.list;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[com.spring3.componentScanFilterTest.IParent]的匹配bean依赖[com.spring3.componentScanFilterTest.IParent]的集合:期望至少有1个bean符合条件autowire候选人这种依赖。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = childList)}

但是如果我使用的话,而不是@Autowired和@Qualifier:     @Resource(名称= “的childList”)

有效。为什么?根据我的理解,@ Autowired用于通过类型自动匹配属性匹配,@ Qualifier用于从多个不明确的bean中选择任何一个bean。

请解释。

2 个答案:

答案 0 :(得分:0)

类型匹配不适用于定义为集合的bean。

  

如果您打算按名称表达注释驱动的注入,请不要主要使用@Autowired - 即使技术上能够通过@Qualifier值引用bean名称。相反,更喜欢JSR-250 @Resource注释,该注释在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关。

     

作为此语义差异的特定结果,无法通过@Autowired注入本身定义为集合或映射类型的bean,因为类型匹配不适用于它们。对这样的bean使用@Resource,以唯一名称引用特定的集合/映射bean。

下面: http://docs.spring.io/spring/docs/2.5.x/reference/beans.html#beans-autowired-annotation-qualifiers

您正在尝试获取具有限定符“childList”的所有Parent类型的列表。

答案 1 :(得分:0)

春天docs说。

作为此语义差异的特定结果,本身定义为集合或映射类型的bean无法通过@Autowired注入,因为类型匹配不适用于它们。将@Resource用于此类bean,以唯一名称引用特定集合或映射bean。

希望这清楚你的怀疑。