4

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

我有一个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。然后在运行时,我将需要能够初始化类型“myPackage.Father”的变量并使用任何子类(多态机制)实例化它。我的意思是这样的:

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

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

Bean definition is abstract

我该怎么处理?

感谢您的帮助,在此先感谢!

4

3 回答 3

3

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

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

在你的情况下

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

指的是定义为导致问题的抽象的bean。

于 2013-09-30T13:21:57.383 回答
2

首先抽象bean与抽象类无关,它们甚至不需要映射到一个类。它们用于对另一个bean共享的公共属性进行分组。但是你不能将抽象bean用作引用在另一个 bean 中连接一个属性。如果您的 bean myPackage.Another 具有 myPackage.Father 类型的引用,并且您的子 bean 可分配(实现的扩展)到 myPackage.Father,那么您可以在 myPackage.Another bean 中连接 childA 或 childB 像这样

 <bean id="reference" class="myPackage.Another"> 
            <property name="atrib4" ref="childA"></property>
    </bean>
于 2013-09-30T15:26:23.560 回答
0

抽象类和抽象bean没有区别。当你使用bean引用另一个抽象的bean时,意味着你想实例化一个抽象类,它肯定不能工作!使用抽象类时要小心!一个抽象类用于模板类,你可以扩展它!

于 2013-10-01T06:05:55.730 回答