我正在尝试通过继承父bean(它是抽象的)在Spring上下文中实例化一个没有类定义的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
抽象类声明:
public abstract class AbstractBeanClass<SOURCE, TARGET>
extends AbstractConverter<SOURCE, TARGET>
implements PopulatorList<SOURCE, TARGET>
{
...
}
注意:还有其他类可以扩展此类。我上面提到的“其他有效的春豆”都没有扩展到这个类。
注意2:我知道这很奇怪,并且,根据Java基础知识,它应该不起作用(就像所有人都提到的那样)。但是,我不知道如何将其他Spring bean放在上下文中。我试图将“其他有效的春豆”复制到我的代码中,更改一些重复的名称,并且它有效。而且,这就是我想要理解的......
答案 0 :(得分:2)
Juliano所指的这个具体例子来自hybris商务套件。 Hybris具有相互依赖的扩展概念。每个扩展都定义了自己的应用程序上下文,可以访问其继承的应用程序上下文(来自那些被声明为依赖项的扩展)。
在此示例中,在根应用程序上下文中声明了一个abstractPopulatingConverter bean声明,其声明的java类是abstract。 但是,在依赖树下面的其他应用程序上下文中,有一个别名定义,用于此#34; abstractPopulatingConverter&#34;指向具有类的bean定义。 这就是为什么在很多情况下(即在依赖树之下的那些情况下)使用parent =&#34; abstractPopulatingConverter&#34;因为它指向由别名定义的新bean。
答案 1 :(得分:0)
当Spring容器面对absatract Java类(不是抽象bean)时,这是非常常见的消息。检查你的com.java.bean.AbstractBeanClass代码,你可能会找到&#34; public abstract class&#34;。
答案 2 :(得分:0)
我在这里缺少什么?
我不知道你的其他项目中发生了什么,但Spring无法为abstract
的类实例化bean。
关于abstract
bean,Spring documentation个州
子bean定义从父定义继承配置数据。
[...]
子bean定义使用父定义中的bean类 如果没有指定,但也可以覆盖它。在后一种情况下, 子bean类必须与父类兼容,即它 必须接受父母的财产价值。
换句话说,用abstract="true"
声明的bean定义只是用作其他bean的模板。
Java不允许abstract
类的实例化。 Spring不能否决这种语言功能。 Spring无法实例化abstract
类类型的bean。
答案 3 :(得分:-1)
找到答案:
确实,就像Sotirios Delimanolis评论一样,&#34;你必须有其他东西在进行,代理某种类型的可能&#34; ,Spring有一个代理实例化这种类型的bean声明,但它不能在没有方法的情况下实例化bean(它们只是在抽象类中声明,未实现)。
所以你必须实施&#34;这些方法,如下:
<bean id="childBean" parent="abstractBean">
<lookup-method name="notImplementedMethod" bean="anotherBean"/>
</bean>
anotherBean 必须与 notImplementedMethod 的类型相同。