在Spring中,abstract="true"是什么意思?

47

在Java中,抽象类不能被实例化。但是Spring说类似于abstract="true"的bean可以被创建。如果抽象类的状态只能由其子类实例初始化(我想我是对的),那么如果我需要在定义在抽象类中的方法内部使用该属性,是否有可能呢?我有一组以下代码:

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个回答

108

在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
}

请注意,FooDaoBarDao没有任何共同的父(抽象或非抽象)基类。父抽象bean定义仅用于分组共同属性,以便您避免在XML中重复定义。

另一方面,引入抽象的Dao类,让FooDaoBarDao都继承它,是个好主意:

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视为一种在XML中减少重复的方式,当多个具体bean具有相同的依赖关系时。


3
需要注意的是,Spring不会实例化抽象Bean。 - plus-
在基于注解的bean配置中,如何设置abstract="true"? - Jaspreet Jolly

1
实际上,抽象父bean不需要定义类属性,你只需要一个普通的属性来共享。
根据这个tutorial
引用: 父bean不能单独实例化,因为它是不完整的,并且明确标记为抽象的。当定义像这样是抽象的时候,它仅可用作纯模板bean定义,用作子定义的父定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接