我需要一些关于下一个主题的帮助。
我有一个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>
我感谢任何帮助,提前谢谢!
答案 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时,它意味着你要实例化一个抽象类,它无法正常工作! 当你使用抽象类时要小心!抽象类用于模板类,您可以扩展它!