Sobes.tech
Middle

Mi az életciklusa egy Spring-ben létrehozott objektumnak?

sobes.tech MI

Válasz az MI-től

  1. Létrehozás: A Spring példányt hoz létre az objektumból.
  2. Tulajdonságok feltöltése: A függőségek (pl. @Autowired, @Value jelölésekkel ellátott mezők) injektálódnak settereken vagy mezőkön keresztül.
  3. Aware interfészek: Ha a bean implementálja a BeanNameAware, BeanFactoryAware, ApplicationContextAware vagy más Aware interfészeket, a Spring meghívja a megfelelő metódusokat (setBeanName, setBeanFactory, setApplicationContext stb.), átadva a kontextust.
  4. BeanPostProcessors (az inicializálás előtt): Az inicializálás előtt meghívódnak a regisztrált BeanPostProcessor-ek postProcessBeforeInitialization metódusai.
  5. Bean inicializálása:
    • Ha a bean implementálja az InitializingBean-t, akkor meghívódik az afterPropertiesSet() metódusa.
    • Ha az @Bean(initMethod="...") vagy az XML-ben init-method van megadva, akkor ez a metódus kerül meghívásra.
  6. BeanPostProcessors (az inicializálás után): Az inicializálás után meghívódnak a postProcessAfterInitialization metódusok. Ebben a szakaszban gyakran proxy-k (pl. tranzakciókezelés vagy biztonság) jönnek létre.
  7. Kész a használatra: Az objektum teljesen konfigurált és használatra kész.
  8. Megsemmisítés:
    • Ha a bean implementálja a DisposableBean-t, akkor meghívódik a destroy() metódusa.
    • Ha az @Bean(destroyMethod="...") vagy az XML-ben destroy-method van megadva, akkor ez a metódus kerül meghívásra.
    • Meghívódik a @PreDestroy-vel jelölt metódus.
  9. Tisztítás: A Spring eltávolítja a bean-t a kontextusból.
// Példa egy életciklusban részt vevő bean-re
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. Tulajdonságok feltöltése (setterrel)
    private Dependency requiredDependency;

    public void setRequiredDependency(Dependency requiredDependency) {
        System.out.println("2. Függőség beállítása");
        this.requiredDependency = requiredDependency;
    }

    // Aware interfészek
    @Override
    public void setBeanName(String name) {
        System.out.println("3. Bean név beállítása: " + name);
        this.beanName = name;
    }

    // Bean inicializálása (az InitializingBean-ből)
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5. InitializingBean afterPropertiesSet() hívása");
        // Inicializációs logika
    }

    // @PostConstruct módszer
    @PostConstruct
    public void postConstructMethod() {
        System.out.println("5. @PostConstruct módszer hívása");
        // Inicializációs logika
    }

    // Egyéni initMethod
    public void customInitMethod() {
        System.out.println("5. Egyéni init módszer hívása");
        // Inicializációs logika
    }

    // Kész a használatra
    public void doSomething() {
        System.out.println("7. A bean készen áll és csinál valamit");
    }

    // Megsemmisítés (DisposableBean-ből)
    @Override
    public void destroy() throws Exception {
        System.out.println("8. DisposableBean destroy() hívása");
        // Tisztítási logika
    }

    // @PreDestroy módszer
    @PreDestroy
    public void preDestroyMethod() {
        System.out.println("8. @PreDestroy módszer hívása");
        // Tisztítási logika
    }

    // Egyéni destroyMethod
    public void customDestroyMethod() {
        System.out.println("8. Egyéni destroy módszer hívása");
        // Tisztítási logika
    }

    // Belső osztály a függőség példájához
    public static class Dependency {
        // ...
    }
}