Wenn wir Spring Beans mit Dependency Injection konfigurieren, möchten wir manchmal sicherstellen, dass alles ordnungsgemäß initialisiert wird, bevor unsere Bean damit beginnt, Clientanfragen zu bedienen. Ähnlich ist es, wenn der Kontext zerstört wird, müssen wir möglicherweise einige von Spring Bean verwendete Ressourcen schließen.
Spring @PostConstruct
Wenn wir eine Methode in Spring Bean mit der Annotation @PostConstruct
annotieren, wird sie nach der Initialisierung des Spring Beans ausgeführt. Wir können nur eine Methode mit der Annotation @PostConstruct
haben. Diese Annotation ist Teil der Common Annotations API und gehört zum JDK-Modul javax.annotation-api
. Wenn Sie diese Annotation in Java 9 oder höher verwenden, müssen Sie dieses Jar-File explizit zu 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 obige Abhängigkeit nicht hinzufügen.
Spring @PreDestroy
Wenn wir eine Spring-Bean-Methode mit der PreDestroy-Annotation annotieren, wird sie aufgerufen, wenn die Bean-Instanz aus dem Kontext entfernt wird. Dies ist ein sehr wichtiger Punkt zu verstehen – wenn Ihre Spring-Bean-Bereich „prototype“ ist, wird sie nicht vollständig vom Spring-Container verwaltet und die PreDestroy
-Methode wird nicht aufgerufen. Wenn eine Methode namens shutdown
oder close
vorhanden ist, wird der Spring-Container versuchen, sie automatisch als Rückrufmethoden zu konfigurieren, wenn die Bean zerstört wird.
Frühling @PostConstruct und @PreDestroy Beispiel
Hier ist eine einfache 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 instance created");
}
@PostConstruct
private void init() {
System.out.println("Verifying Resources");
}
@PreDestroy
private void shutdown() {
System.out.println("Shutdown All Resources");
}
public void close() {
System.out.println("Closing All Resources");
}
}
Bemerken Sie, dass ich auch eine close
-Methode definiert habe, um zu überprüfen, ob sie aufgerufen wird, wenn unsere Bean zerstört wird oder nicht. Hier ist meine einfache Frühlingskonfigurations-Klasse.
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();
}
}
I don’t need to explicitly specify my bean as a singleton but I will later change its value to “prototype” and see what happens with @PostConstruct and @PreDestroy methods. Here is my main class where I am creating spring context and getting few instances of MyBean.
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 folgende Ausgabe.
MyBean instance created
Verifying Resources
1640296160
1640296160
Shutdown All Resources
Closing All Resources
So wird die @PostConstruct-Methode nach der Instanziierung des Beans aufgerufen. Wenn der Kontext geschlossen wird, ruft er sowohl die Shutdown- als auch die Close-Methode auf.
Spring @PostConstruct und @PreDestroy mit Prototyp-Scope
Ändern Sie einfach den Scope-Wert auf prototype in MyConfiguration
und führen Sie die Hauptklasse aus. Sie erhalten eine Ausgabe wie unten dargestellt.
MyBean instance created
Verifying Resources
1640296160
MyBean instance created
Verifying Resources
1863374262
Es ist also klar, dass der Spring-Container das Bean bei jeder Anfrage initialisiert, seine @PostConstruct-Methode aufruft und es dann an den Client übergibt. Spring verwaltet das Bean danach nicht mehr, und in diesem Fall muss der Client alle Ressourcenbereinigung durch direktes Aufrufen der PreDestroy-Methode durchführen.
Zusammenfassung
@PostConstruct und @PreDestroy sind wichtige Annotationen, die mit dem Spring Bean-Lifecycle-Management verwendet werden können. Wir können sie verwenden, um zu überprüfen, ob das Bean ordnungsgemäß initialisiert wurde, und dann alle Ressourcen zu schließen, wenn das Bean aus dem Spring-Kontext entfernt wird.
Sie können den vollständigen Projektcode aus unserem GitHub-Repository überprüfen.
Source:
https://www.digitalocean.com/community/tutorials/spring-postconstruct-predestroy