У нас есть иерархия классов обработчиков в нашей кодовой базе, которая реализует своего рода принцип цепочки ответственности. Существует абстрактный родительский класс, и он расширяется несколькими дочерними классами, которые также получают абстракцию в своем конструкторе.
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"/>
...
Есть ли способ преодолеть это? Иерархия классов обработчиков является устаревшим кодом, и на данный момент мы не можем изменить их исходные коды.