Wird in einer verwalteten Bean @PostConstruct
nach dem regulären Java-Objektkonstruktor aufgerufen.
Warum sollte ich @PostConstruct
anstelle des regulären Konstruktors selbst die Initialisierung nach Bean verwenden?
Wird in einer verwalteten Bean @PostConstruct
nach dem regulären Java-Objektkonstruktor aufgerufen.
Warum sollte ich @PostConstruct
anstelle des regulären Konstruktors selbst die Initialisierung nach Bean verwenden?
final
. Warum wird@PostConstruct
J2EE angesichts dieses Musters hinzugefügt - sie müssen sicherlich einen anderen Anwendungsfall gesehen haben?Antworten:
Denn wenn der Konstruktor aufgerufen wird, ist die Bean noch nicht initialisiert - dh es werden keine Abhängigkeiten eingefügt. In der
@PostConstruct
Methode ist die Bean vollständig initialisiert und Sie können die Abhängigkeiten verwenden.weil dies der Vertrag ist, der garantiert, dass diese Methode nur einmal im Bean-Lebenszyklus aufgerufen wird. Es kann vorkommen (obwohl es unwahrscheinlich ist), dass eine Bean in ihrer internen Arbeitsweise mehrmals vom Container instanziiert wird, dies garantiert jedoch, dass
@PostConstruct
sie nur einmal aufgerufen wird.quelle
Das Hauptproblem ist:
* offensichtlich ohne Konstruktorinjektion
Beispiel aus der Praxis:
WICHTIG :
@PostConstruct
und@PreDestroy
wurden in Java 11 vollständig entfernt .Um sie weiterhin verwenden zu können, müssen Sie Ihren Abhängigkeiten die JAR javax.annotation-api hinzufügen .
Maven
Gradle
quelle
in a constructor, the injection of the dependencies has not yet occurred.
wahr mit Setter- oder Feldinjektion, aber nicht wahr mit Konstruktorinjektion.Wenn Ihre Klasse die gesamte Initialisierung im Konstruktor durchführt,
@PostConstruct
ist sie tatsächlich redundant.Wenn jedoch die Abhängigkeiten Ihrer Klasse mithilfe von Setter-Methoden eingefügt wurden, kann der Konstruktor der Klasse das Objekt nicht vollständig initialisieren, und manchmal muss eine Initialisierung durchgeführt werden, nachdem alle Setter-Methoden aufgerufen wurden, daher der Anwendungsfall von
@PostConstruct
.quelle
Stellen Sie sich das folgende Szenario vor:
Da Car vor der Feldeinspritzung instanziiert werden muss, ist die Einspritzpunkt-Engine während der Ausführung des Konstruktors immer noch null, was zu einer NullPointerException führt.
Dieses Problem kann entweder durch JSR-330 Dependency Injection für die Java- Konstruktorinjektion oder durch JSR 250 Common Annotations für die Annotation der Java @ PostConstruct-Methode gelöst werden.
@ PostConstruct
JSR-250 definiert einen allgemeinen Satz von Anmerkungen, die in Java SE 6 enthalten sind.
Mit der Annotation @PostConstruct kann die Definition von Methoden ausgeführt werden, nachdem die Instanz instanziiert und alle Injects ausgeführt wurden.
Anstatt die Initialisierung im Konstruktor durchzuführen, wird der Code in eine mit @PostConstruct kommentierte Methode verschoben.
Bei der Verarbeitung von Post-Konstrukt-Methoden müssen einfach alle mit @PostConstruct kommentierten Methoden gefunden und nacheinander aufgerufen werden.
Die Verarbeitung der Nachkonstruktionsmethoden muss nach Abschluss der Instanziierung und Injektion durchgeführt werden.
quelle
Auch die konstruktorbasierte Initialisierung funktioniert nicht wie beabsichtigt, wenn eine Art Proxy oder Remoting erforderlich ist.
Der ct wird aufgerufen, wenn ein EJB deserialisiert wird und wenn ein neuer Proxy dafür erstellt wird ...
quelle