Что означает абстракция = "истина" в spring?

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

Ответ 1

Абстрактный beans в 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 не имеют базового базового класса (абстрактного или нет). Родительское абстрактное определение bean используется только для групповых общих свойств, поэтому вы избегаете повторения в 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 bean не нужно определять класс. Относитесь к абстрактному beans как к способу уменьшения дублирования в XML, когда несколько конкретных beans имеют одинаковые зависимости.

Ответ 2

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

В соответствии с этим tutorial

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