Что подразумевается под abstract = "true" весной? - PullRequest
44 голосов
/ 22 февраля 2012

Абстрактные классы не могут быть созданы в 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. 
        } 
    }
}

Ответы [ 2 ]

95 голосов
/ 22 февраля 2012

Абстрактные бины в Spring несколько отличаются от абстрактных классов. Фактически, абстрактный bean-компонент в 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
}

Обратите внимание, что 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 голосов
/ 18 октября 2016

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

Согласно этому учебнику

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...