Ответ 1
Абстрактный beans в 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
не имеют базового базового класса (абстрактного или нет). Родительское абстрактное определение bean используется только для групповых общих свойств, поэтому вы избегаете повторения в 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
bean не нужно определять класс. Относитесь к абстрактному beans как к способу уменьшения дублирования в XML, когда несколько конкретных beans имеют одинаковые зависимости.