Dans un bean géré, @PostConstruct
est appelé d'après le constructeur d'objet Java standard.
Pourquoi devrais-je utiliser @PostConstruct
pour initialiser par bean, au lieu du constructeur normal lui-même?
Dans un bean géré, @PostConstruct
est appelé d'après le constructeur d'objet Java standard.
Pourquoi devrais-je utiliser @PostConstruct
pour initialiser par bean, au lieu du constructeur normal lui-même?
final
. Compte tenu de ce modèle, pourquoi est@PostConstruct
-il ajouté à J2EE - ils ont sûrement vu un autre cas d'utilisation?Réponses:
car lorsque le constructeur est appelé, le bean n'est pas encore initialisé - c'est-à-dire qu'aucune dépendance n'est injectée. Dans la
@PostConstruct
méthode, le bean est entièrement initialisé et vous pouvez utiliser les dépendances.car c'est le contrat qui garantit que cette méthode ne sera invoquée qu'une seule fois dans le cycle de vie du bean. Il peut arriver (bien que peu probable) qu'un bean soit instancié plusieurs fois par le conteneur dans son fonctionnement interne, mais il garantit qu'il
@PostConstruct
ne sera invoqué qu'une seule fois.la source
Le principal problème est que:
* évidemment hors Constructor Injection
Exemple du monde réel:
IMPORTANT :
@PostConstruct
et@PreDestroy
ont été complètement supprimés dans Java 11 .Pour continuer à les utiliser, vous devrez ajouter le JAR javax.annotation-api à vos dépendances.
Maven
Gradle
la source
in a constructor, the injection of the dependencies has not yet occurred.
vrai avec l'injection de setter ou de champ, mais pas vrai avec l'injection de constructeur.Si votre classe effectue toute son initialisation dans le constructeur, elle
@PostConstruct
est en effet redondante.Cependant, si votre classe a ses dépendances injectées à l'aide de méthodes de définition, le constructeur de la classe ne peut pas initialiser complètement l'objet, et parfois une initialisation doit être effectuée après l'appel de toutes les méthodes de définition, d'où le cas d'utilisation de
@PostConstruct
.la source
Considérez le scénario suivant:
Étant donné que Car doit être instancié avant l'injection sur le terrain, le moteur du point d'injection est toujours nul pendant l'exécution du constructeur, ce qui entraîne une NullPointerException.
Ce problème peut être résolu soit par injection de dépendance JSR-330 pour l'injection de constructeur Java, soit par annotations communes JSR 250 pour l'annotation de méthode Java @PostConstruct.
@PostConstruct
JSR-250 définit un ensemble commun d'annotations qui a été inclus dans Java SE 6.
L'annotation @PostConstruct permet de définir les méthodes à exécuter après l'instanciation de l'instance et toutes les injections.
Au lieu d'effectuer l'initialisation dans le constructeur, le code est déplacé vers une méthode annotée avec @PostConstruct.
Le traitement des méthodes post-construction est une simple question de trouver toutes les méthodes annotées avec @PostConstruct et de les invoquer tour à tour.
Le traitement des méthodes post-construction doit être effectué une fois l'instanciation et l'injection terminées.
la source
De plus, l'initialisation basée sur le constructeur ne fonctionnera pas comme prévu chaque fois qu'une sorte de proxy ou de communication à distance est impliquée.
Le ct sera appelé chaque fois qu'un EJB sera désérialisé et chaque fois qu'un nouveau proxy sera créé pour lui ...
la source