web-dev-qa-db-fra.com

Qu'entend-on par abstract = "true" au printemps?

Les classes abstraites ne peuvent pas être instanciées en Java. Mais le printemps dit quelque chose comme la création de haricots avec abstract="true". Si un état d'une classe abstraite est initialisé uniquement par son instance de classe enfant (je suppose que j'ai raison), alors si j'ai besoin d'utiliser cet attribut à l'intérieur de la méthode définie dans la classe abstraite, il y a une possibilité de il? J'ai un ensemble de code comme suit:

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. 
        } 
    }
}
43
Arun

Les haricots abstraits au printemps sont quelque peu différents des classes abstraites. En fait, les haricots abstraits au printemps ne doivent même pas être mappés à une classe. Prenons ceci comme exemple:

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

Et les cours:

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
}

Notez que FooDao et BarDao n'ont pas de classe de base parent (abstraite ou non) en commun. La définition de bean abstraite parent est utilisée uniquement pour grouper les propriétés communes , afin d'éviter les répétitions en XML.

D'autre part, introduire une classe abstraite Dao dont FooDao et BarDao hériteraient serait une bonne idée:

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
}

Mais toujours dao bean ne doit pas définir de classe. Traitez les beans abstraits comme un moyen de réduire les doubles emplois en XML lorsque plusieurs beans concrets ont les mêmes dépendances.

92
Tomasz Nurkiewicz

En fait, le bean parent abstrait n'est pas nécessaire pour définir l'attribut de classe, vous pouvez simplement avoir besoin d'une propriété commune pour le partage.

Selon ce tutorial

Le bean parent ne peut pas être instancié seul car il s'agit de incomplet, et il est également explicitement marqué comme abstrait. Lorsqu'un La définition est abstraite comme celle-ci, elle n’est utilisable qu’en tant que modèle pur définition de haricot qui sert de définition parent pour l'enfant définitions.

0
Hamedz