Sobes.tech
Middle

Wat is de levenscyclus van een object dat in Spring wordt gemaakt?

sobes.tech AI

Antwoord van AI

  1. Instantiate: Spring maakt een instantie van het object.
  2. Populate Properties: Dependencies (velden gemarkeerd met @Autowired, @Value, etc.) worden geïnjecteerd via setters of velden.
  3. Aware Interfaces: Als de bean BeanNameAware, BeanFactoryAware, ApplicationContextAware of andere Aware-interfaces implementeert, roept Spring de bijbehorende methoden aan (setBeanName, setBeanFactory, setApplicationContext, etc.) en geeft de context door.
  4. BeanPostProcessors (pre-initialisatie): Voordat de initialisatiemethoden worden aangeroepen, wordt postProcessBeforeInitialization van de geregistreerde BeanPostProcessor aangeroepen.
  5. Initialiserende Bean:
    • Als de bean InitializingBean implementeert, wordt de methode afterPropertiesSet() aangeroepen.
    • Als een initialisatiemethode is gespecificeerd via @Bean(initMethod="...") of init-method in XML, wordt deze methode aangeroepen.
  6. BeanPostProcessors (post-initialisatie): Na initialisatie wordt postProcessAfterInitialization van de geregistreerde BeanPostProcessor aangeroepen. In deze fase worden vaak proxy-objecten gemaakt (bijvoorbeeld voor transacties of beveiliging).
  7. Klaar voor gebruik: Het object wordt beschouwd als volledig geconfigureerd en klaar voor gebruik.
  8. Destroy:
    • Als de bean DisposableBean implementeert, wordt de methode destroy() aangeroepen.
    • Als een destroy-methode is gespecificeerd via @Bean(destroyMethod="...") of destroy-method in XML, wordt deze methode aangeroepen.
    • De methode gemarkeerd met @PreDestroy wordt aangeroepen.
  9. Opruimen: Spring verwijdert de bean uit de context.
// Voorbeeld van een bean die deelneemt aan de levenscyclus
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. Properties vullen (via setter)
    private Dependency requiredDependency;

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

    // 3. Aware interfaces
    @Override
    public void setBeanName(String name) {
        System.out.println("3. Bean naam instellen: " + name);
        this.beanName = name;
    }

    // 5. Initialiserende Bean (van InitializingBean)
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5. afterPropertiesSet() van InitializingBean aangeroepen");
        // Initialisatie logica
    }

    // 5. @PostConstruct methode
    @PostConstruct
    public void postConstructMethod() {
        System.out.println("5. @PostConstruct methode aangeroepen");
        // Initialisatie logica
    }

    // 5. Aangepaste init-methode
    public void customInitMethod() {
        System.out.println("5. Aangepaste init-methode aangeroepen");
        // Initialisatie logica
    }

    // 7. Klaar voor gebruik
    public void doSomething() {
        System.out.println("7. Bean is klaar en doet iets");
    }

    // 8. Vernietiging (van DisposableBean)
    @Override
    public void destroy() throws Exception {
        System.out.println("8. destroy() van DisposableBean aangeroepen");
        // Opruimingslogica
    }

    // 8. @PreDestroy (aangeroepen)
    @PreDestroy
    public void preDestroyMethod() {
        System.out.println("8. @PreDestroy methode aangeroepen");
        // Opruimingslogica
    }

    // 8. Aangepaste destroy-methode
    public void customDestroyMethod() {
        System.out.println("8. Aangepaste destroy-methode aangeroepen");
        // Opruimingslogica
    }

    // Interne klasse voor voorbeeld afhankelijkheid
    public static class Dependency {
        // ...
    }
}