抽象クラスはJavaでインスタンス化できません。しかし、春は、abstract="true"
。抽象クラスの状態がその子クラスインスタンスによってのみ初期化される場合(私は正しいと思います)、抽象クラスで定義されているメソッド内でその属性を使用する必要がある場合、...の可能性がありますそれ?次のようなコードセットがあります。
class abstract A {
private Something somethingObj;
// getters and setters are present.
public void logSomething() {
try{
//some code which throws exception
}
catch(Exception e){
somethingObj.logIt(e);// I have some logic inlogIt method.
}
}
}
Springの抽象Beanは、抽象クラスとは多少異なります。実際、Springの抽象Beanはどのクラスにもマッピングする必要さえありません。これを例に取ります:
<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はクラスを定義する必要はありません。複数の具象Beanが同じ依存関係を持つ場合、抽象BeanをXMLの重複を減らす方法として扱います。
実際、抽象親Beanはクラス属性を定義するために必要ではなく、共有するために共通のプロパティが必要な場合があります。
これによると tutorial
親Beanは不完全であるため、それ自体ではインスタンス化できません。また、明示的に抽象としてマークされます。定義がこのように抽象的である場合、子定義の親定義として機能する純粋なテンプレートBean定義としてのみ使用できます。