Pourquoi utiliser @PostConstruct?
Dans un managed bean, @PostConstruct
est appelée après que le Java ordinaire constructeur de l'objet.
Pourquoi voudrais-je utiliser @PostConstruct
pour initialiser par bean, au lieu de l'ordinaire constructeur lui-même?
- J'ai eu l'impression que le constructeur de l'injection est généralement préféré pour permettre de dépendances
final
. Étant donné que le motif, pourquoi est -@PostConstruct
être ajouté à J2EE - ils doivent avoir vu un autre cas d'utilisation sûrement?
Vous devez vous connecter pour publier un commentaire.
car lorsque le constructeur est appelé, le haricot n'est pas encore initialisée à - dire pas de dépendances sont injectés. Dans le
@PostConstruct
méthode du bean est entièrement initialisé et vous pouvez utiliser les dépendances.parce que c'est le contrat qui garantit que cette méthode sera invoquée qu'une seule fois dans la fève de cycle de vie. Il peut arriver (mais peu probable) qu'un bean est instancié plusieurs fois par le conteneur dans son fonctionnement interne, mais elle garantit que
@PostConstruct
sera invoqué qu'une seule fois.La principal problème est que:
*excluant évidemment Constructeur Injection
Exemple réel:
IMPORTANT:
@PostConstruct
et@PreDestroy
ont été complètement retiré en Java 11.De continuer de les utiliser, vous aurez besoin d'ajouter le javax.annotation-api POT à vos dépendances.
Maven
Gradle
in a constructor, the injection of the dependencies has not yet occurred.
vrai avec un setter ou un champ d'injection, mais pas du tout vrai avec le constructeur d'injection.Si votre classe effectue l'ensemble de son initialisation dans le constructeur, puis
@PostConstruct
est en effet redondant.Toutefois, si votre classe a ses dépendances injecté à l'aide des méthodes de définition, alors le constructeur de la classe ne peut pas entièrement d'initialiser l'objet, et parfois certains initialisation doit être effectuée après que toutes les méthodes de définition ont été appelés, par conséquent le cas d'utilisation de
@PostConstruct
.Envisagez le scénario suivant:
Depuis la Voiture doit être instancié avant le domaine de l'injection, le point d'injection du moteur est toujours null lors de l'exécution du constructeur, résultant en une NullPointerException.
Ce problème peut être résolu soit par JSR 330 Injection de Dépendance pour Java constructeur de l'injection ou de la JSR 250 Commun Annotations de Java @PostConstruct méthode d'annotation.
@PostConstruct
JSR 250 définit un ensemble commun d'annotations qui a été inclus dans Java SE 6.
L' @PostConstruct annotation permet la définition de méthodes pour être exécuté après que l'instance a été instancié et toutes injecte ont été effectuées.
Au lieu d'effectuer l'initialisation dans le constructeur, le code est déplacé à une méthode annotée avec @PostConstruct.
Le traitement de post-construire des méthodes est une simple question de trouver toutes les méthodes annotées avec @PostConstruct et les invoquer à son tour.
Le traitement de post-construire des méthodes doit être effectuée après l'instanciation et l'injection ont été achevés.
Également constructeur en fonction d'initialisation ne fonctionnera pas comme prévu chaque fois que quelque sorte de l'utilisation de proxy ou de l'accès à distance est en cause.
Le ct sera appelée chaque fois qu'un EJB obtient désérialisé, et chaque fois qu'un nouveau proxy est créé pour elle...