Middle
Quel est le cycle de vie d'un objet créé dans Spring?
sobes.tech IA
Réponse de l'IA
- Instancier : Spring crée une instance de l'objet.
- Remplir les propriétés : Les dépendances (champs marqués avec
@Autowired,@Value, etc.) sont injectées via des setters ou des champs. - Interfaces Aware : Si le bean implémente
BeanNameAware,BeanFactoryAware,ApplicationContextAwareou d'autres interfaces Aware, Spring appelle les méthodes correspondantes (setBeanName,setBeanFactory,setApplicationContext, etc.), en passant le contexte. - BeanPostProcessors (pré-initialisation) : Avant d'appeler les méthodes d'initialisation,
postProcessBeforeInitializationdesBeanPostProcessorenregistrés est appelé. - Bean d'initialisation :
- Si le bean implémente
InitializingBean, sa méthodeafterPropertiesSet()est appelée. - Si une méthode d'initialisation est spécifiée via
@Bean(initMethod="...")ouinit-methoden XML, cette méthode est appelée.
- Si le bean implémente
- BeanPostProcessors (post-initialisation) : Après l'initialisation,
postProcessAfterInitializationdesBeanPostProcessorenregistrés est appelé. À cette étape, des objets proxy sont souvent créés (par exemple, pour la gestion des transactions ou la sécurité). - Prêt à l'emploi : L'objet est considéré comme entièrement configuré et prêt à être utilisé.
- Destruction :
- Si le bean implémente
DisposableBean, sa méthodedestroy()est appelée. - Si une méthode de destruction est spécifiée via
@Bean(destroyMethod="...")oudestroy-methoden XML, cette méthode est appelée. - La méthode annotée avec
@PreDestroyest appelée.
- Si le bean implémente
- Nettoyage : Spring supprime le bean du contexte.
// Exemple de bean participant au cycle de vie
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class MySpringBean implements InitializingBean, DisposableBean, BeanNameAware {
private String beanName;
// 2. Remplir les propriétés (via setter)
private Dependency requiredDependency;
public void setRequiredDependency(Dependency requiredDependency) {
System.out.println("2. Définition de la dépendance");
this.requiredDependency = requiredDependency;
}
// 3. Interfaces Aware
@Override
public void setBeanName(String name) {
System.out.println("3. Définition du nom du bean : " + name);
this.beanName = name;
}
// 5. Bean d'initialisation (de InitializingBean)
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5. Appel de afterPropertiesSet() de InitializingBean");
// Logique d'initialisation
}
// 5. Bean d'initialisation (de @PostConstruct)
@PostConstruct
public void postConstructMethod() {
System.out.println("5. Méthode @PostConstruct appelée");
// Logique d'initialisation
}
// 5. Méthode d'initialisation personnalisée
public void customInitMethod() {
System.out.println("5. Méthode init personnalisée appelée");
// Logique d'initialisation
}
// 7. Prêt à utiliser
public void doSomething() {
System.out.println("7. Le bean est prêt et fait quelque chose");
}
// 8. Destruction (de DisposableBean)
@Override
public void destroy() throws Exception {
System.out.println("8. Méthode destroy() de DisposableBean appelée");
// Logique de nettoyage
}
// 8. Destruction (de @PreDestroy)
@PreDestroy
public void preDestroyMethod() {
System.out.println("8. Méthode @PreDestroy appelée");
// Logique de nettoyage
}
// 8. Destruction (méthode destroy personnalisée)
public void customDestroyMethod() {
System.out.println("8. Méthode destroy personnalisée appelée");
// Logique de nettoyage
}
// Classe interne pour exemple de dépendance
public static class Dependency {
// ...
}
}