2012-02-22 3 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

Абстрактные бобы весной несколько отличаются от абстрактных классов. Фактически, абстрактный компонент весны даже не должен быть сопоставлен ни с одним классом. Возьмите это в качестве примера:

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

Обратите внимание, что FooDao и BarDao не имеют родителей (абстрактную или нет) базового класса общего. Определение родительского абстрактного компонента используется только для общих свойств группы, поэтому вы избегаете повторения в XML.

С другой стороны, вводя абстрактные Dao класс, как FooDao и 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 боб не должен определить класс. Относитесь к абстрактным бобам как к способу уменьшения дублирования в XML, когда несколько конкретных бобов имеют одинаковые зависимости.

+0

Следует отметить, что абстрактные бобы не обусловлены весной –

0

На самом деле, абстрактный родительский компонент необязателен для определения атрибута класса, для совместного использования может потребоваться общее свойство.

Согласно этому tutorial

Родитель боб не может быть создан сам по себе, потому что это неполно, и он также явно отмечен как реферата. Когда определение является абстрактным, как это, оно может использоваться только как чистый шаблон , который служит в качестве родительского определения для дочерних определений .