Lorsque nous configurons les Spring Beans en utilisant l’injection de dépendance, parfois nous voulons nous assurer que tout est initialisé correctement avant que notre bean ne commence à traiter les demandes du client. De même, lorsque le contexte est détruit, nous devons peut-être fermer certaines ressources utilisées par le bean Spring.
Spring @PostConstruct
Lorsque nous annotons une méthode dans Spring Bean avec l’annotation @PostConstruct
, elle est exécutée après l’initialisation du bean Spring. Nous ne pouvons avoir qu’une seule méthode annotée avec @PostConstruct
. Cette annotation fait partie de l’API Common Annotations et elle fait partie du module JDK javax.annotation-api
. Donc, si vous utilisez cette annotation en Java 9 ou version ultérieure, vous devrez ajouter explicitement ce fichier JAR à votre projet. Si vous utilisez Maven, la dépendance suivante doit être ajoutée.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
Si vous utilisez Java 8 ou une version inférieure, vous n’aurez pas besoin d’ajouter la dépendance ci-dessus.
Spring @PreDestroy
Lorsque nous annotons une méthode de bean Spring avec l’annotation PreDestroy, elle est appelée lorsque l’instance du bean est supprimée du contexte. C’est un point très important à comprendre – si votre portée de bean Spring est « prototype », alors il n’est pas complètement géré par le conteneur Spring et la méthode PreDestroy
ne sera pas appelée. S’il existe une méthode nommée shutdown
ou close
, alors le conteneur Spring tentera de les configurer automatiquement en tant que méthodes de rappel lorsque le bean est détruit.
Spring @PostConstruct et @PreDestroy Exemple
Voici un simple bean Spring avec les méthodes @PostConstruct et @PreDestroy.
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");
}
}
Remarquez que j’ai également défini une méthode close
pour vérifier si elle est appelée lorsque notre bean est détruit ou non. Voici ma classe de configuration Spring simple.
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();
}
}
Lorsque nous exécutons la classe ci-dessus, nous obtenons la sortie suivante.
MyBean instance created
Verifying Resources
1640296160
1640296160
Shutdown All Resources
Closing All Resources
Ainsi, la méthode @PostConstruct est appelée après l’instanciation du bean. Lorsque le contexte se ferme, il appelle à la fois la méthode shutdown et close.
Spring @PostConstruct et @PreDestroy avec la portée Prototype
Il suffit de changer la valeur de la portée en prototype dans MyConfiguration
et d’exécuter la classe principale. Vous obtiendrez une sortie comme ci-dessous.
MyBean instance created
Verifying Resources
1640296160
MyBean instance created
Verifying Resources
1863374262
Il est donc clair que le conteneur Spring initialise le bean à chaque demande, appelle sa méthode @PostConstruct puis le remet au client. Spring ne gère plus le bean par la suite et dans ce cas, le client doit effectuer toute la récupération des ressources en appelant directement la méthode PreDestroy.
Résumé
@PostConstruct et @PreDestroy sont des annotations importantes à utiliser avec la gestion du cycle de vie du bean Spring. Nous pouvons les utiliser pour vérifier que le bean est correctement initialisé, puis fermer toutes les ressources lorsque le bean est supprimé du contexte Spring.
Vous pouvez consulter le code complet du projet sur notre Repository GitHub.
Source:
https://www.digitalocean.com/community/tutorials/spring-postconstruct-predestroy