Middle
Wat is de levenscyclus van een object dat in Spring wordt gemaakt?
sobes.tech AI
Antwoord van AI
- Instantiate: Spring maakt een instantie van het object.
- Populate Properties: Dependencies (velden gemarkeerd met
@Autowired,@Value, etc.) worden geïnjecteerd via setters of velden. - Aware Interfaces: Als de bean
BeanNameAware,BeanFactoryAware,ApplicationContextAwareof andere Aware-interfaces implementeert, roept Spring de bijbehorende methoden aan (setBeanName,setBeanFactory,setApplicationContext, etc.) en geeft de context door. - BeanPostProcessors (pre-initialisatie): Voordat de initialisatiemethoden worden aangeroepen, wordt
postProcessBeforeInitializationvan de geregistreerdeBeanPostProcessoraangeroepen. - Initialiserende Bean:
- Als de bean
InitializingBeanimplementeert, wordt de methodeafterPropertiesSet()aangeroepen. - Als een initialisatiemethode is gespecificeerd via
@Bean(initMethod="...")ofinit-methodin XML, wordt deze methode aangeroepen.
- Als de bean
- BeanPostProcessors (post-initialisatie): Na initialisatie wordt
postProcessAfterInitializationvan de geregistreerdeBeanPostProcessoraangeroepen. In deze fase worden vaak proxy-objecten gemaakt (bijvoorbeeld voor transacties of beveiliging). - Klaar voor gebruik: Het object wordt beschouwd als volledig geconfigureerd en klaar voor gebruik.
- Destroy:
- Als de bean
DisposableBeanimplementeert, wordt de methodedestroy()aangeroepen. - Als een destroy-methode is gespecificeerd via
@Bean(destroyMethod="...")ofdestroy-methodin XML, wordt deze methode aangeroepen. - De methode gemarkeerd met
@PreDestroywordt aangeroepen.
- Als de bean
- 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 {
// ...
}
}