我们在我们的代码库中有一系列处理程序类,它们实现了一种责任链原则。有一个抽象父类,它是由几个子类,这也收到了抽象在其构造扩展使用抽象Spring bean作为构造函数-arg
public abstract class AbstractHandler {
public AbstractHandler(final AbstractHandler next, final PropertyName propertyName) {
this.next = next;
this.propertyName = propertyName;
}
...
public class OneConcreteChildHandler extends AbstractHandler {
public OneConcreteChildHandler(final AbstractHandler next) {
super(next, PropertyName.OneConcreteChild);
}
...
现在,我们需要注入的具体子类的一个实例到一个新实现的服务类,我们应该用XML配置它。我们可以配置抽象父类的抽象bean,但是这一次则似乎并没有被允许使用作为构造精氨酸的具体子bean
<bean id="abstractHandler" abstract="true" class="...AbstractHandler" />
<bean id="oneConcreteChildHandler" class="...OneConcreteChildHandler" parent="abstractHandler">
<constructor-arg ref="abstractHandler"/> //"abstract bean can not be used here"
</bean>
<bean id="someService" class="...SomeService">
<constructor-arg ref="oneConcreteChildHandler"/>
...
有什么办法来克服这个?处理程序类层次结构是遗留代码,我们现在无法修改它们的源代码。
谢谢。我们只注意到,在具体的子类中,实际上存在一个用于关闭CoR链(它的构造函数包含super(null,null))的现有的TailChildHandler类,我们可以在配置中使用它,方法与您的twoConcreteChildHandler相同例。这解决了这个问题。 – hammerfest