'Instantiation of bean failed; Is it an abstract class?' 尝试用抽象父实例化 bean 时

'Instantiation of bean failed; Is it an abstract class?' When trying to instantiate a bean with an abstract parent

我试图通过继承抽象的父 bean 在 Spring 上下文中实例化一个没有 class 定义的 bean。像这样:

<bean id="childBean" parent="abstractBean">
    ...
</bean>

<bean id="abstractBean" class="com.java.bean.AbstractBeanClass" 
        abstract="true" />

但是 Spring 给我以下错误消息:

Error creating bean with name 'childBean' defined in class path resource 
    [project-spring.xml]: 
Instantiation of bean failed; nested exception is 
    org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.java.bean.AbstractBeanClass]: 
Is it an abstract class?;
nested exception is java.lang.InstantiationException
...

我记得在另一个项目中有这个,它运行得很好。
我记得在同一个项目中有这个,而且效果很好。

我在这里错过了什么?

更新 1 发现另一个豆子被完全按照我提到的方式被植入:

<bean id="variantOptionDataConverter" parent="abstractPopulatingConverter">
    ...
</bean>

更新 2
摘要声明 class:

public abstract class AbstractBeanClass<SOURCE, TARGET>
        extends AbstractConverter<SOURCE, TARGET>
        implements PopulatorList<SOURCE, TARGET>
{
...
}

注意:还有其他 class 扩展此 class。我上面提到的 "other spring beans that works" 的 None 扩展了这个 class.

注意 2:我知道这很奇怪,而且根据 Java 基本原理,它不应该起作用(就像每个人提到的那样)。但是,我不知道如何将其他 Spring 个 bean 放入上下文中。我试图将 "other spring beans that work" 复制到我的代码中,更改一些重复的名称,并且成功了。而且,这就是我想要了解的...

当 Spring 容器面对抽象 Java class(不是抽象 bean)时,这是非常常见的消息。检查您的 com.java.bean.AbstractBeanClass 代码,您可能可以找到 "public abstract class"。

What am I missing here?

我不知道您的其他项目中发生了什么,但是 Spring 无法为 class 实例化 abstract 的 Bean。

关于 abstract 个 bean,Spring documentation 状态

A child bean definition inherits configuration data from a parent definition.

[...]

A child bean definition uses the bean class from the parent definition if none is specified, but can also override it. In the latter case, the child bean class must be compatible with the parent, that is, it must accept the parent’s property values.

换句话说,用 abstract="true" 声明的 bean 定义只是用作其他 bean 的模板。

Java 不允许实例化 abstract classes。 Spring 无法否决此语言功能。 Spring 无法实例化 abstract class 类型的 bean。

找到答案:

的确,就像Sotirios Delimanolis评论的那样,"You must have something else going on, proxying of some kind maybe",Spring有一个实例化这种bean声明的代理,但是它可以不要在没有方法的情况下实例化 bean(这些方法只是在抽象 class 中声明,未实现)。
所以你必须"implement"这些方法,像这样:

<bean id="childBean" parent="abstractBean">
   <lookup-method name="notImplementedMethod" bean="anotherBean"/>
</bean>

anotherBean 必须与 notImplementedMethod.

类型相同

Juliano 所指的这个具体示例来自 hybris 商务套件。 Hybris 具有相互依赖的扩展概念。每个扩展都定义了自己的应用程序上下文,这些应用程序上下文可以访问其继承的应用程序上下文(来自那些声明为依赖项的扩展)。

在此示例中,在根应用程序上下文中声明了一个 abstractPopulatingConverter bean 声明,其中声明的 java class 是抽象的。 但是,在其他应用程序上下文中,在依赖树的下方有一个针对此 "abstractPopulatingConverter" 的别名定义,它指向具有具体 class 的 bean 定义。 这就是为什么在很多情况下(即那些在依赖树中更靠下的情况)使用 parent="abstractPopulatingConverter" 可以工作,因为它指向由别名定义的新 bean。