Spring抛出错误:Bean定义是抽象的

时间:2013-09-30 12:52:07

标签: java spring spring-mvc spring-3

我需要一些关于下一个主题的帮助。

我有一个bean的层次结构,就像那样:

<bean id="father" class="myPackage.Father" abstract="true"/>  

<bean id="childA" class="myPackage.ChildA" parent="father">    
        <property name="atrib1" value="hello"></property>  
</bean>  

<bean id="childB" class="myPackage.ChildB" parent="father">  
        <property name="atrib2" value="bye"></property>  
        <property name="atrib3" value="other"></property>  
</bean>  

我需要创建另一个包含对抽象类的引用的bean。然后在运行时,我需要能够初始化TYPE“myPackage.Father”的变量,并使用任何子类(多态机制)实例化它。我的意思是这样的:

<bean id="reference" class="myPackage.Another"> 
        <property name="atrib4" ref="father"></property>
</bean>  

请注意,引用(myPackage.Another的实例)不是myPackage.Father的子类。但是使用这些行Spring会抛出下一个错误:

Bean definition is abstract

我怎么处理它?<​​/ p>

我感谢任何帮助,提前谢谢!

3 个答案:

答案 0 :(得分:3)

抽象bean永远不会被实例化为对象,它们只以定义的形式存在。

来自文件:http://docs.spring.io/spring/docs/3.0.x/reference/beans.html 父bean不能单独实例化,因为它不完整,并且也明确标记为抽象。当定义是这样的抽象时,它只能用作纯模板bean定义,作为子定义的父定义。尝试使用这样一个抽象的父bean,通过将它作为另一个bean的ref属性引用或者使用父bean id进行显式的getBean()调用,会返回错误。类似地,容器的内部preInstantiateSingletons()方法忽略定义为abstract的bean定义。

在你的情况下

<bean id="reference" class="myPackage.Another"> 
        <property name="atrib4" ref="father"></property>
</bean>

引用定义为abstract的bean导致问题。

答案 1 :(得分:2)

首先,抽象bean与抽象类无关 它们甚至不需要映射到类。它们用于对另一个bean共享的公共属性进行分组。但是你不能使用抽象bean作为引用来连接另一个bean中的属性。 如果你的bean myPackage.Another有一个myPackage.Father类型的引用,你的子bean可以赋值给myPackage.Father,那么你可以连接childA或childB 在你的myPackage.Another bean这样的

 <bean id="reference" class="myPackage.Another"> 
            <property name="atrib4" ref="childA"></property>
    </bean>

答案 2 :(得分:0)

抽象类和抽象bean之间没有什么不同。当你使用bean并引用另一个抽象的bean时,它意味着你要实例化一个抽象类,它无法正常工作! 当你使用抽象类时要小心!抽象类用于模板类,您可以扩展它!