使用Spring从抽象类调用具体方法

时间:2010-02-06 02:22:03

标签: java spring

我处境艰难,我无法理解。我正在使用遗留代码,我们正在从PicoContainer 1.1迁移到Spring 2.5。我遇到了Pico抓取抽象类并能够调用具体方法的代码。我怎么能在春天这样做?

这是我到目前为止在Spring尝试的内容:

<bean id="module" class="a.b.c.AbstractClass" abstract="true">
   <constructor-arg ref="aFactory1" index="0" />
   <constructor-arg ref="aFactory2" index="1" />
</bean>

正如预期的那样,当Spring注入此代码时,它不能,因为bean是Abstract。

如果可以,我会使用MethodInvokingFactoryBean,但这不起作用,因为参数是从另一个方法调用的,而另一个方法本身是由另一个bean完成的。

如何在这样的情况下使用Spring?或者我应该尝试推下另一个类中定义的具体方法吗?

2 个答案:

答案 0 :(得分:2)

更具体的内容会有所帮助。

如果要在抽象类上调用方法,则必须有一个具体的类 somewhere ,它扩展AbstractClass并实现抽象方法;即使那个具体的类是由PicoContainer在幕后构建的。

简单的事情是:

class ConcreteClass extends AbstractClass {
  // implement abstract methods
}

豆子看起来像:

<bean id="concreteModule" parent="module"/>

您可以在concreteModule bean上调用方法。

如果你真的很大胆,你可以尝试method injection将抽象方法直接注入module。请务必删除abstract="true"。但我不完全确定这是否有效。

答案 1 :(得分:1)

如果我没记错的话,下面的abstract="true"表示这不是一个可实例化的bean,而是(实际上)一个用于创建bean的模板。

<bean id="module" class="a.b.c.Class" abstract="true"> 
   <constructor-arg ref="aFactory1" index="0" />
   <constructor-arg ref="aFactory2" index="1" />
</bean>

你使用它的方法是定义子bean; e.g。

<bean id="m1" parent="module"/>
<bean id="m2" parent="module">
   <property name="p1" value="42"/>
</bean>

这意味着子bean m1m2将继承module的构造函数参数定义。 m2 bean在实例化后也会设置p1属性。

我认为该类总是必须是一个具体的Java类名,因为这是你告诉Spring实例化的。显然,Spring无法实例化抽象类,或强制将特定参数传递给抽象类构造函数。