我处境艰难,我无法理解。我正在使用遗留代码,我们正在从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?或者我应该尝试推下另一个类中定义的具体方法吗?
答案 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 m1
和m2
将继承module
的构造函数参数定义。 m2
bean在实例化后也会设置p1
属性。
我认为该类总是必须是一个具体的Java类名,因为这是你告诉Spring实例化的。显然,Spring无法实例化抽象类,或强制将特定参数传递给抽象类构造函数。