Sobes.tech
Middle
236

Koji je životni ciklus objekta kreiranog u Spring-u?

Одговор од АИ

sobes.tech АИ

  1. Instanciranje: Spring kreira instancu objekta.
  2. Popunjavanje svojstava: Zavisnosti (polja označena sa @Autowired, @Value itd.) se ubrizgavaju putem setera ili polja.
  3. Aware interfejsi: Ako bean implementira BeanNameAware, BeanFactoryAware, ApplicationContextAware ili druge Aware interfejse, Spring poziva odgovarajuće metode (setBeanName, setBeanFactory, setApplicationContext itd.), prosleđujući kontekst.
  4. BeanPostProcessors (pre inicijalizacije): Pre poziva metoda inicijalizacije, pozivaju se postProcessBeforeInitialization registrovanih BeanPostProcessor.
  5. Inicijalizacija beana:
    • Ako bean implementira InitializingBean, poziva mu se metoda afterPropertiesSet().
    • Ako je specificirana inicijalizaciona metoda putem @Bean(initMethod="...") ili init-method u XML, poziva se ta metoda.
  6. BeanPostProcessors (posle inicijalizacije): Nakon inicijalizacije, pozivaju se postProcessAfterInitialization registrovanih BeanPostProcessor.
  7. Spreman za upotrebu: Objekat se smatra potpuno konfigurisan i spreman za upotrebu.
  8. Uništavanje:
    • Ako bean implementira DisposableBean, poziva mu se metoda destroy().
    • Ako je specificirana metoda za uništavanje putem @Bean(destroyMethod="...") ili destroy-method u XML, poziva se ta metoda.
    • Poziva se metoda označena sa @PreDestroy.
  9. Čišćenje: Spring uklanja bean iz konteksta.
// Primer beana koji učestvuje u životnom ciklusu
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. Popunjavanje svojstava (kroz setter)
    private Dependency requiredDependency;

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

    // Aware interfejsi
    @Override
    public void setBeanName(String name) {
        System.out.println("3. Postavljanje imena beana: " + name);
        this.beanName = name;
    }

    // Inicijalizacija beana (iz InitializingBean)
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5. Pozivanje afterPropertiesSet() iz InitializingBean");
        // Logika inicijalizacije
    }

    // @PostConstruct metoda
    @PostConstruct
    public void postConstructMethod() {
        System.out.println("5. Pozivanje metode @PostConstruct");
        // Logika inicijalizacije
    }

    // Prilagođeni init metod
    public void customInitMethod() {
        System.out.println("5. Pozivanje prilagođene init metode");
        // Logika inicijalizacije
    }

    // Spreman za upotrebu
    public void doSomething() {
        System.out.println("7. Bean je spreman i radi nešto");
    }

    // Uništavanje (iz DisposableBean)
    @Override
    public void destroy() throws Exception {
        System.out.println("8. Pozivanje destroy() iz DisposableBean");
        // Logika čišćenja
    }

    // @PreDestroy metoda
    @PreDestroy
    public void preDestroyMethod() {
        System.out.println("8. Pozivanje @PreDestroy metode");
        // Logika čišćenja
    }

    // Prilagođeni destroy metod
    public void customDestroyMethod() {
        System.out.println("8. Pozivanje prilagođene destroy metode");
        // Logika čišćenja
    }

    // Interna klasa za primer zavisnosti
    public static class Dependency {
        // ...
    }
}