Sobes.tech
Middle

Aký je životný cyklus objektu vytvoreného v Spring?

sobes.tech AI

Odpoveď od AI

  1. Inštancovanie: Spring vytvorí inštanciu objektu.
  2. Napĺňanie vlastností: Závislosti (polia označené s @Autowired, @Value atď.) sa injektujú cez setter alebo polia.
  3. Aware rozhrania: Ak bean implementuje BeanNameAware, BeanFactoryAware, ApplicationContextAware alebo iné Aware rozhrania, Spring volá príslušné metódy (setBeanName, setBeanFactory, setApplicationContext atď.), odovzdávajúc kontext.
  4. BeanPostProcessors (pred inicializáciou): Pred volaním inicializačných metód sa volajú postProcessBeforeInitialization registrovaných BeanPostProcessor.
  5. Inicializácia beanu:
    • Ak bean implementuje InitializingBean, volá sa jeho metóda afterPropertiesSet().
    • Ak je špecifikovaná inicializačná metóda cez @Bean(initMethod="...") alebo init-method v XML, volá sa táto metóda.
  6. BeanPostProcessors (po inicializácii): Po inicializácii sa volajú postProcessAfterInitialization registrovaných BeanPostProcessor.
  7. Pripravené na použitie: Objekt je považovaný za úplne nakonfigurovaný a pripravený na použitie.
  8. Zničenie:
    • Ak bean implementuje DisposableBean, volá sa jeho metóda destroy().
    • Ak je špecifikovaná metóda na zničenie cez @Bean(destroyMethod="...") alebo destroy-method v XML, volá sa táto metóda.
    • Volá sa metóda označená s @PreDestroy.
  9. Upratovanie: Spring odstráni bean z kontextu.
// Príklad beanu, ktorý sa zúčastňuje na životnom cykle
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. Napĺňanie vlastností (cez setter)
    private Dependency requiredDependency;

    public void setRequiredDependency(Dependency requiredDependency) {
        System.out.println("2. Nastavenie závislosti");
        this.requiredDependency = requiredDependency;
    }

    // Aware rozhrania
    @Override
    public void setBeanName(String name) {
        System.out.println("3. Nastavenie mena beanu: " + name);
        this.beanName = name;
    }

    // Inicializácia beanu (z InitializingBean)
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5. Volanie afterPropertiesSet() z InitializingBean");
        // Logika inicializácie
    }

    // @PostConstruct metóda
    @PostConstruct
    public void postConstructMethod() {
        System.out.println("5. Volanie metódy @PostConstruct");
        // Logika inicializácie
    }

    // Vlastná init metóda
    public void customInitMethod() {
        System.out.println("5. Volanie vlastnej init metódy");
        // Logika inicializácie
    }

    // Pripravené na použitie
    public void doSomething() {
        System.out.println("7. Bean je pripravený a robí niečo");
    }

    // Zničenie (z DisposableBean)
    @Override
    public void destroy() throws Exception {
        System.out.println("8. Volanie destroy() z DisposableBean");
        // Logika čistenia
    }

    // @PreDestroy metóda
    @PreDestroy
    public void preDestroyMethod() {
        System.out.println("8. Volanie @PreDestroy metódy");
        // Logika čistenia
    }

    // Vlastná destroy metóda
    public void customDestroyMethod() {
        System.out.println("8. Volanie vlastnej destroy metódy");
        // Logika čistenia
    }

    // Vnútorná trieda pre príklad závislosti
    public static class Dependency {
        // ...
    }
}