2012-02-22 73 views
37

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

回答

83

在春季摘要豆從抽象類有所不同。事實上,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豆沒有定義一個類。把抽象的豆子,以此來減少重複的XML時的一些具體豆有相同的依賴關係。

+0

應該注意的是抽象的Bean不會由Spring實例化 – 2017-07-07 10:12:25

0

其實,父bean是沒有必要定義class屬性,你可能只需要共享共同財產。

根據這一tutorial

父豆不能對自己進行實例化,因爲它是 不完整的,並且它也被明確標記爲抽象的。當 定義是抽象的這個樣子,這是僅可使用作爲一個純粹的模板 bean定義,可作爲孩子 定義的父定義。