【问题标题】:Spring throws the error: Bean definition is abstractSpring抛出错误:Bean定义是抽象的
【发布时间】:2013-09-30 12:52:07
【问题描述】:

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

我有一个 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

我该如何处理?

感谢任何帮助,在此先感谢!

【问题讨论】:

  • bean 定义上的 abstract 与抽象类有 NO 关系。如果您需要另一种实例化方法,请定义包含此逻辑的 FactoryBean,或使用包含引用 bean 的属性文件并使用 PropertyPlaceHolder 在运行时替换它。

标签: java spring spring-mvc spring-3


【解决方案1】:

抽象 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。

【讨论】:

  • 感谢您的回答。我知道它是一个抽象类,但我的新问题是如何将以下代码 java 转换为 bean:myPackage.Father atrib4 = new myPackage.ChildA()。这在java中是可以的,但是用bean怎么写呢?
  • @CarlosSaric: in spring abstract="true" 用于模板,所以你不能直接引用它,解决方法将在初始化阶段分配属性值,2-使用 ref直接到 childa 对象,3-或具有另一个 id 的具有父父亲和所有实现覆盖行为的 bean,然后引用该对象。简单地说,spring applicationcontext 将 bean 定义解析为具体类的对象。从逻辑上思考你是如何在 Spring 中为 map 赋值的,如果你想单独指定 hastable,你将给出相同的定义并引用它
【解决方案2】:

首先抽象bean与抽象类无关 它们甚至不需要映射到一个类。它们用于对另一个 bean 共享的公共属性进行分组。但是你不能使用抽象 bean 作为 ref 来连接另一个 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>

【讨论】:

  • 所以你告诉我,如果实例'reference'在运行时可以取两个值中的任何一个,那么我将需要以下bean定义: 不是吗?
  • 是的,如果你想要两个 myPackage 类型的不同 bean。另一个每个都有它的 atrib4,连接不同的子 bean childA 和 childB
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2015-03-17
    • 2016-03-26
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多