Абстрактные бины в Spring несколько отличаются от абстрактных классов. Фактически, абстрактный bean-компонент в Spring даже не должен отображаться ни на один класс. Возьмите это как пример:
<bean id="dao" abstract="true">
<property name="dataSource" ref="dataSource"/>
<property name="someHelper" ref="someHelper"/>
</bean>
<bean id="fooDao" class="FooDao" parent="dao">
<property name="fooHelper" ref="fooHelper"/>
</bean>
<bean id="barDao" class="BarDao" parent="dao">
<property name="barHelper" ref="barHelper"/>
</bean>
И классы:
public class FooDao {
private DataSource dataSource;
private SomeHelper someHelper;
private FooHelper fooHelper;
//setters
}
public class BarDao {
private DataSource dataSource;
private SomeHelper someHelper;
private BarHelper barHelper;
//setters
}
Обратите внимание, что FooDao
и BarDao
не имеют общего родительского (абстрактного или нет) базового класса. Определение родительского абстрактного компонента используется только для группировки общих свойств , поэтому вы избегаете повторения в XML.
С другой стороны, было бы неплохо ввести абстрактный класс Dao
, от которого наследуют FooDao
и BarDao
:
public abstract Dao {
protected DataSource dataSource;
protected SomeHelper someHelper;
//setters
}
public class FooDao extends Dao {
private FooHelper fooHelper;
//setters
}
public class BarDao extends Dao {
private BarHelper barHelper;
//setters
}
Но все же dao
боб не должен определять класс. Рассматривайте абстрактные компоненты как способ уменьшить дублирование в XML, когда несколько конкретных компонентов имеют одинаковые зависимости.