【问题标题】:What is meant by abstract="true" in spring?spring 中的 abstract="true" 是什么意思?
【发布时间】:2012-03-12 22:37:01
【问题描述】:

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

【问题讨论】:

    标签: java spring exception jakarta-ee


    【解决方案1】:

    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 中重复。

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

    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不是被Spring实例化的
    • 在基于注解的bean配置中如何设置abstract="true"?
    【解决方案2】:

    其实,抽象的父bean不需要定义类属性,你可能只需要一个公共属性来共享。

    据此tutorial

    父 bean 不能自己实例化,因为它是 不完整,并且它也被明确标记为抽象。当一个 定义是这样抽象的,只能作为纯模板使用 用作子定义的父定义的 bean 定义 定义。

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 2015-07-11
      • 1970-01-01
      • 2016-08-30
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      相关资源
      最近更新 更多