Spring PostConstruct und PreDestroy
Wenn wir Spring Beans mit Dependency Injection konfigurieren, möchten wir manchmal sicherstellen, dass alles ordnungsgemäß initialisiert ist, bevor unser Bean beginnt, die Client-Anfragen zu bearbeiten. Ähnlich, wenn der Kontext zerstört wird, müssen wir möglicherweise einige von dem Spring Bean genutzte Ressourcen schließen.
Spring PostConstruct
Wenn wir eine Methode in einem Spring Bean mit der @PostConstruct Annotation annotieren, wird sie ausgeführt, nachdem das Spring Bean initialisiert wurde. Wir können nur eine Methode mit der @PostConstruct Annotation haben. Diese Annotation ist Teil der Common Annotations API und sie gehört zum JDK-Modul javax.annotation-api. Wenn Sie diese Annotation in Java 9 oder höher verwenden, müssen Sie dieses Jar explizit Ihrem Projekt hinzufügen. Wenn Sie Maven verwenden, sollte die folgende Abhängigkeit hinzugefügt werden.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
Wenn Sie Java 8 oder eine niedrigere Version verwenden, müssen Sie die oben genannte Abhängigkeit nicht hinzufügen.
Spring PreDestroy
Wenn wir eine Methode eines Spring Beans mit der PreDestroy Annotation annotieren, wird sie aufgerufen, wenn eine Bean-Instanz aus dem Kontext entfernt wird. Dies ist ein sehr wichtiger Punkt zum Verstehen – wenn der Scope Ihres Spring Beans „prototype“ ist, wird es nicht vollständig vom Spring Container verwaltet und die PreDestroy-Methode wird nicht aufgerufen. Wenn es eine Methode namens shutdown oder close gibt, wird der Spring Container versuchen, sie automatisch als Callback-Methoden zu konfigurieren, wenn das Bean zerstört wird.
Spring PostConstruct und PreDestroy Beispiel
Hier ist ein einfaches Spring Bean mit @PostConstruct und @PreDestroy Methoden.
package com.journaldev.spring;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class MyBean {
public MyBean() {
System.out.println("MyBean-Instanz erstellt");
}
@PostConstruct
private void init() {
System.out.println("Ressourcen überprüfen");
}
@PreDestroy
private void shutdown() {
System.out.println("Alle Ressourcen herunterfahren");
}
public void close() {
System.out.println("Alle Ressourcen schließen");
}
}
Beachten Sie, dass ich auch eine close-Methode definiert habe, um zu überprüfen, ob sie aufgerufen wird, wenn unser Bean zerstört wird oder nicht. Hier ist meine einfache Spring-Konfigurationsklasse.
package com.journaldev.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class MyConfiguration {
@Bean
@Scope(value="singleton")
public MyBean myBean() {
return new MyBean();
}
}
Ich muss mein Bean nicht explizit als Singleton angeben, aber ich werde später seinen Wert auf „prototype“ ändern und sehen, was mit den @PostConstruct und @PreDestroy Methoden passiert. Hier ist meine Hauptklasse, in der ich den Spring-Kontext erstelle und einige Instanzen von MyBean erhalte.
package com.journaldev.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MySpringApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(MyConfiguration.class);
ctx.refresh();
MyBean mb1 = ctx.getBean(MyBean.class);
System.out.println(mb1.hashCode());
MyBean mb2 = ctx.getBean(MyBean.class);
System.out.println(mb2.hashCode());
ctx.close();
}
}
Wenn wir die obige Klasse ausführen, erhalten wir folgenden Output.
MyBean-Instanz erstellt
Ressourcen überprüfen
1640296160
1640296160
Alle Ressourcen herunterfahren
Alle Ressourcen schließen
So wird die @PostConstruct Methode aufgerufen, nachdem das Bean instanziiert wurde. Wenn der Kontext geschlossen wird, ruft er sowohl die shutdown- als auch die close-Methode auf.
Spring PostConstruct und PreDestroy mit Prototype Scope
Ändern Sie einfach den Scope-Wert auf prototype in MyConfiguration und führen Sie die Hauptklasse aus. Sie erhalten den Output wie unten.
MyBean-Instanz erstellt
Ressourcen überprüfen
1640296160
MyBean-Instanz erstellt
Ressourcen überprüfen
1863374262
Es ist also klar, dass der Spring-Container das Bean bei jeder Anfrage initialisiert, seine @PostConstruct-Methode aufruft und es dann dem Kunden übergibt. Spring verwaltet das Bean danach nicht mehr und in diesem Fall muss der Kunde alle Ressourcenbereinigungen direkt durch Aufrufen der PreDestroy-Methode durchführen.
Zusammenfassung
@PostConstruct und @PreDestroy sind wichtige Annotationen für das Lifecycle-Management von Spring Beans. Wir können sie verwenden, um zu überprüfen, dass das Bean ordnungsgemäß initialisiert ist und dann alle Ressourcen schließen, wenn das Bean aus dem Spring-Kontext entfernt wird.