2017-08-27 1 views
1

Supposons que nous avons les classes suivantesOrdre du @PostConstruct et l'héritage

public abstract class AbstractFoo { 

    @PostConstruct 
    private void doIt() { 
     // 
    } 
} 

public class Foo extends AbstractFoo { 

    @PostConstruct 
    private void doIt() { 
     // 
    } 
} 

Lorsque AbstractFoo.doIt() et Foo.doIt() seront appelés - quel est l'ordre?

+0

Qu'est-ce qui vous empêche de simplement l'essayer? – luk2302

+0

@ luk2302 Je veux obtenir une réponse canonique. J'ai cherché mais je n'ai pas pu trouver. –

Répondre

3

@PostConstruct est la dernière chose à faire exécuter à l'initialisation d'un bean géré donné, par rapport à sa position dans la chaîne d'héritage. De la spécification

Le conteneur doit veiller à ce que:

  • méthodes initialiseur (c.-à-@PostConstruct) déclarés par une classe X dans la hiérarchie du type de haricot sont appelés après que tous les champs injectés déclarés par X ou par les superclasses de X ont été initialisées.

  • Toute @PostConstruct rappel déclarée par une classe X dans la hiérarchie du type de la fève est appelée après que toutes les méthodes d'initialiseur déclarées par X ou par superclasses de X ont été appelés, après que tous les champs injectés déclarés par X ou par superclasses de X ont été initialisés.

Pro Tip: Avec 2.0 CDI, you can use @Inject to declare an initializer method comme une alternative @PostConstruct et la restriction que vous pouvez avoir qu'un seul dans une classe donnée. La différence ici est que @PostConstruct est encore exécuté en dernier et est le seul endroit où vous pouvez être assuré que tous les composants injectés seront disponibles.

+0

Méthodes d'initialisation disponibles dans CDI 1.0 aussi! – Darsstar