春天的抽象=“真实”是什么意思?

时间:2012-02-22 15:18:21

标签: java spring exception java-ee

抽象类无法在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. 
        } 
    }
}

2 个答案:

答案 0 :(得分:94)

Spring中的抽象bean与抽象类有些不同。实际上,Spring中的abstract 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
}

请注意,FooDaoBarDao没有任何父类(抽象或非抽象)基类。父抽象bean定义仅用于对公共属性进行分组,因此您可以避免在XML中重复。

另一方面,引入DaoFooDao继承的抽象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重复的一种方法。

答案 1 :(得分:0)

实际上,抽象父bean不是定义类属性所必需的,您可能只需要一个公共属性来进行共享。

根据此tutorial

  

父bean无法自行实例化,因为它是   不完整,也明确标记为抽象。当一个   这样的定义是抽象的,它只能用作纯模板   bean定义,用作child的父定义   定义