Sobes.tech
Middle

Quel est le cycle de vie d'un objet créé dans Spring?

sobes.tech IA

Réponse de l'IA

  1. Instancier : Spring crée une instance de l'objet.
  2. Remplir les propriétés : Les dépendances (champs marqués avec @Autowired, @Value, etc.) sont injectées via des setters ou des champs.
  3. Interfaces Aware : Si le bean implémente BeanNameAware, BeanFactoryAware, ApplicationContextAware ou d'autres interfaces Aware, Spring appelle les méthodes correspondantes (setBeanName, setBeanFactory, setApplicationContext, etc.), en passant le contexte.
  4. BeanPostProcessors (pré-initialisation) : Avant d'appeler les méthodes d'initialisation, postProcessBeforeInitialization des BeanPostProcessor enregistrés est appelé.
  5. Bean d'initialisation :
    • Si le bean implémente InitializingBean, sa méthode afterPropertiesSet() est appelée.
    • Si une méthode d'initialisation est spécifiée via @Bean(initMethod="...") ou init-method en XML, cette méthode est appelée.
  6. BeanPostProcessors (post-initialisation) : Après l'initialisation, postProcessAfterInitialization des BeanPostProcessor enregistrés est appelé. À cette étape, des objets proxy sont souvent créés (par exemple, pour la gestion des transactions ou la sécurité).
  7. Prêt à l'emploi : L'objet est considéré comme entièrement configuré et prêt à être utilisé.
  8. Destruction :
    • Si le bean implémente DisposableBean, sa méthode destroy() est appelée.
    • Si une méthode de destruction est spécifiée via @Bean(destroyMethod="...") ou destroy-method en XML, cette méthode est appelée.
    • La méthode annotée avec @PreDestroy est appelée.
  9. 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 {
        // ...
    }
}