Sobes.tech
Middle

Qual è il ciclo di vita di un oggetto creato in Spring?

sobes.tech AI

Risposta dell'AI

  1. Istanzia: Spring crea un'istanza dell'oggetto.
  2. Popolare le proprietà: Le dipendenze (campi contrassegnati con @Autowired, @Value, ecc.) vengono iniettate tramite setter o campi.
  3. Interfacce Aware: Se il bean implementa BeanNameAware, BeanFactoryAware, ApplicationContextAware o altre interfacce Aware, Spring chiama i metodi corrispondenti (setBeanName, setBeanFactory, setApplicationContext, ecc.), passando il contesto.
  4. BeanPostProcessors (pre-inizializzazione): Prima di chiamare i metodi di inizializzazione, viene chiamato postProcessBeforeInitialization dei BeanPostProcessor registrati.
  5. Bean di inizializzazione:
    • Se il bean implementa InitializingBean, viene chiamato il suo metodo afterPropertiesSet().
    • Se viene specificato un metodo di inizializzazione tramite @Bean(initMethod="...") o init-method in XML, viene chiamato quel metodo.
  6. BeanPostProcessors (post-inizializzazione): Dopo l'inizializzazione, viene chiamato postProcessAfterInitialization dei BeanPostProcessor registrati. In questa fase, spesso vengono creati oggetti proxy (ad esempio, per transazioni o sicurezza).
  7. Pronto all'uso: L'oggetto è considerato completamente configurato e pronto all'uso.
  8. Distruzione:
    • Se il bean implementa DisposableBean, viene chiamato il suo metodo destroy().
    • Se viene specificato un metodo di distruzione tramite @Bean(destroyMethod="...") o destroy-method in XML, viene chiamato quel metodo.
    • Viene chiamato il metodo contrassegnato con @PreDestroy.
  9. Pulizia: Spring rimuove il bean dal contesto.
// Esempio di un bean che partecipa al ciclo di vita
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. Popolare le proprietà (tramite setter)
    private Dependency requiredDependency;

    public void setRequiredDependency(Dependency requiredDependency) {
        System.out.println("2. Impostazione dipendenza");
        this.requiredDependency = requiredDependency;
    }

    // 3. Interfacce Aware
    @Override
    public void setBeanName(String name) {
        System.out.println("3. Impostazione nome bean: " + name);
        this.beanName = name;
    }

    // 5. Bean di inizializzazione (da InitializingBean)
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5. Chiamato afterPropertiesSet() di InitializingBean");
        // Logica di inizializzazione
    }

    // 5. Metodo di inizializzazione (@PostConstruct)
    @PostConstruct
    public void postConstructMethod() {
        System.out.println("5. Metodo @PostConstruct chiamato");
        // Logica di inizializzazione
    }

    // 5. Metodo di inizializzazione personalizzato
    public void customInitMethod() {
        System.out.println("5. Metodo init personalizzato chiamato");
        // Logica di inizializzazione
    }

    // 7. Pronto all'uso
    public void doSomething() {
        System.out.println("7. Il bean è pronto e fa qualcosa");
    }

    // 8. Distruzione (da DisposableBean)
    @Override
    public void destroy() throws Exception {
        System.out.println("8. Metodo destroy() di DisposableBean chiamato");
        // Logica di pulizia
    }

    // 8. Distruzione (@PreDestroy)
    @PreDestroy
    public void preDestroyMethod() {
        System.out.println("8. Metodo @PreDestroy chiamato");
        // Logica di pulizia
    }

    // 8. Metodo di distruzione personalizzato
    public void customDestroyMethod() {
        System.out.println("8. Metodo destroy personalizzato chiamato");
        // Logica di pulizia
    }

    // Classe interna di esempio di dipendenza
    public static class Dependency {
        // ...
    }
}