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

2022-08-31 23:51:04

抽象类不能在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. 
        } 
    }
}

答案 1

春天的抽象豆子与抽象类有些不同。事实上,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
}

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

另一方面,引入既有又从中继承的抽象类将是一个好主意:DaoFooDaoBarDao

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
}

但是bean仍然不必定义一个类。将抽象 Bean 视为当多个具体 Bean 具有相同的依赖项时减少 XML 中重复的一种方法。dao


答案 2

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

根据本教程

父 Bean 不能单独实例化,因为它是不完整的,并且它还被显式标记为抽象。当定义像这样抽象时,它只能用作纯模板 Bean 定义,用作子定义的父定义。